Tôi đang cố gắng hiểu số hiệu suất tôi đang nhận được và cách xác định số luồng tối ưu.TCP, HTTP và Điểm đa luồng ngọt
Xem dưới cùng của bài viết này cho kết quả của tôi
tôi đã viết một ứng dụng web đa luồng nghiệm trong perl mà tải một trang, lấy nguồn cho mỗi thẻ hình ảnh và tải các hình ảnh - loại bỏ các dữ liệu.
Nó sử dụng kết nối không chặn với thời gian chờ tệp ban đầu cho mỗi 10 giây tăng gấp đôi sau mỗi lần hết thời gian chờ và thử lại. Nó cũng lưu trữ địa chỉ IP nên mỗi luồng chỉ phải thực hiện tra cứu DNS một lần.
Tổng lượng dữ liệu đã tải xuống là 2271122 byte trong 1316 tệp qua kết nối 2.5Mbit từ http://hubblesite.org/gallery/album/entire/npp/all/hires/true/. Các hình ảnh thu nhỏ được lưu trữ bởi một công ty tuyên bố chuyên về độ trễ thấp cho các ứng dụng băng thông cao.
tường thời gian được tính:
1 Chủ đề mất 04:48 - 0 timeout
2 Chủ đề mất 02:38 - 0 timeout
5 Chủ đề mất 02:22 - 20 timeouts
10 chủ đề mất 02:27 - 40 timeouts
50 chủ đề mất 02:27 - 170 timeouts
trong trường hợp xấu nhất (50 bài) ít hơn 2 giây thời gian CPU được tiêu thụ b y khách hàng.
tập trung bình kích thước 1.7K
trung bình RTT 100 ms (được đo bằng ping)
trung bình cli cpu/img 1 ms
Tốc độ tải xuống trung bình nhanh nhất là 5 bài vào khoảng 15 KB/sec tổng thể.
Máy chủ thực sự dường như có độ trễ khá thấp vì nó chỉ mất 218 mili giây để có được mỗi hình ảnh có nghĩa là nó chỉ mất 18 ms trên trung bình cho máy chủ để xử lý mỗi yêu cầu:
0 cli gửi syn
50 srv rcvs syn
50 srv gửi syn + ack
100 cli Conn thành lập/cli gửi được
150 srv recv của lấy
168 srv đọc tập tin, gửi dữ liệu, các cuộc gọi gần
218 tiêu đề cli recv HTTP + đầy đủ hồ sơ trong 2 segme nts MSS == 1448
Tôi có thể thấy rằng tốc độ tải xuống trung bình cho mỗi tệp thấp vì kích thước tệp nhỏ và chi phí tương đối cao cho mỗi tệp của thiết lập kết nối.
Điều tôi không hiểu là lý do tại sao tôi thấy hầu như không có cải thiện về hiệu suất vượt quá 2 luồng. Máy chủ có vẻ đủ nhanh, nhưng đã bắt đầu định thời gian kết nối ở 5 luồng.
Thời gian chờ dường như bắt đầu sau khoảng 900 - 1000 kết nối thành công cho dù đó là 5 hoặc 50 luồng, mà tôi giả định có thể là một số loại ngưỡng điều chỉnh trên máy chủ, nhưng tôi mong đợi 10 chủ đề vẫn nhanh hơn đáng kể so với 2 .
Tôi có thiếu gì đó ở đây không?
EDIT-1
Chỉ cần để so sánh vì tôi đã cài đặt phần mở rộng DownThemAll Firefox và tải về những hình ảnh sử dụng nó. Tôi đặt nó thành 4 kết nối đồng thời với thời gian chờ là 10 giây. DTM mất khoảng 3 phút để tải về tất cả các tập tin + ghi chúng vào đĩa, và nó cũng bắt đầu trải qua thời gian chờ sau khoảng 900 kết nối.
Tôi sẽ chạy tcpdump để thử và có được hình ảnh tốt hơn những gì đang diễn ra ở cấp độ giao thức tcp.
Tôi cũng xóa bộ nhớ cache của Firefox và nhấn tải lại. 40 giây để tải lại trang và tất cả các hình ảnh. Điều đó dường như quá nhanh - có thể Firefox đã giữ chúng trong bộ nhớ cache không bị xóa? Vì vậy, tôi đã mở Opera và nó cũng mất khoảng 40 giây. Tôi cho rằng chúng nhanh hơn rất nhiều vì chúng phải sử dụng đường ống HTTP/1.1?
Và câu trả lời là! ??
Vì vậy, sau một chút kiểm tra và viết mã để tái sử dụng các ổ cắm thông qua pipelining tôi phát hiện ra một số thông tin thú vị.
Khi chạy ở 5 chủ đề, phiên bản không pipelined lấy 1026 hình ảnh đầu tiên trong 77 giây nhưng phải mất thêm 65 giây để truy xuất 290 hình ảnh còn lại. Điều này khá nhiều xác nhận MattH's lý thuyết về khách hàng của tôi bị ảnh hưởng bởi sự kiện SYN FLOOD
khiến máy chủ ngừng phản hồi các nỗ lực kết nối của tôi trong một khoảng thời gian ngắn. Tuy nhiên, đó chỉ là một phần của vấn đề kể từ 77 giây vẫn còn rất chậm cho 5 chủ đề để có được 1026 hình ảnh; nếu bạn xóa sự cố SYN FLOOD
, vẫn mất khoảng 99 giây để truy xuất tất cả các tệp. Vì vậy, dựa trên một nghiên cứu nhỏ và một số tcpdump
của nó có vẻ như phần khác của vấn đề là độ trễ và chi phí thiết lập kết nối.
Đây là nơi chúng tôi quay lại vấn đề tìm kiếm "Điểm thú vị" hoặc số lượng chủ đề tối ưu. Tôi đã sửa đổi của khách hàng để thực hiện HTTP/1.1 Pipelining và thấy rằng số lượng tối ưu của bài trong trường hợp này là từ 15 đến 20. Ví dụ:
1 Chủ đề mất 02:37 - 0 timeout
2 Chủ đề mất 01:22 - 0 timeout
5 Chủ đề mất 00:34 - 0 timeout
10 Chủ đề mất 00:20 - 0 timeout
11 Chủ đề mất 00:19 - 0 timeout
15 Chủ đề mất 0 : 16 - 0 thời gian chờ
Có bốn yếu tố mà ảnh hưởng đến điều này; độ trễ/rtt, băng thông đầu cuối tối đa, kích thước bộ đệm recv và kích thước của các tệp hình ảnh đang được tải xuống. See this site for a discussion on how receive buffer size and RTT latency affect available bandwidth.
Ngoài kích thước tệp ở trên, kích thước tệp trung bình ảnh hưởng đến tốc độ truyền tối đa cho mỗi kết nối .Mỗi khi bạn đưa ra yêu cầu GET, bạn tạo một khoảng trống trong đường truyền của bạn có kích thước của RTT kết nối. Ví dụ: nếu , bạn có thể có tốc độ truyền tối đa (kích thước buff/RTT) là 2,5Mbit và RTT của bạn là 100ms, sau đó mọi yêu cầu GET phát sinh khoảng cách tối thiểu 32kB trong ống của bạn. Đối với kích thước hình ảnh trung bình lớn là 320kB, số tiền đó làtrên mỗi tệp, làm giảm hiệu quả băng thông hiện có của bạn xuống 2,25Mbit. Tuy nhiên, cho kích thước tệp trung bình nhỏ là 3,2kB, phí nhảy vọt lên tới 1000% và băng thông có sẵn được giảm xuống còn 232 kbit/giây - khoảng 29kB.
Vì vậy, để tìm số tối ưu của bài:
Gap Size = MPTR * RTT
MPTR/(MPTR/Kích Gap + kích thước tập tin AVG) * Kích thước file AVG)
Đối với kịch bản ở trên, điều này mang lại cho tôi một chuỗi chủ đề tối ưu gồm 11 chủ đề, rất gần với kết quả thực tế của tôi.
Nếu tốc độ kết nối thực tế chậm hơn MPTR lý thuyết thì nó sẽ được sử dụng để tính toán thay thế.
Bạn có chắc là khách hàng của bạn không tự giới hạn trong hai phiên HTTP đồng thời (khiến khách hàng # 3 phải chờ khách hàng # 1/# 2 kết thúc)? Đây là, sau khi tất cả, những gì một số RFC HTTP cho thấy khách hàng * nên * làm. Và nếu không, bạn có chắc chắn rằng * máy chủ * (hoặc một cái gì đó trên đường đi) không làm điều này? I E. bạn có thể xác minh tính đồng thời của các phiên của mình không? – bzlm
@ bzlm: Tôi đã viết máy khách từ đầu, tôi không sử dụng bất kỳ thư viện nào. Vì vậy, tôi khá gần với 100% chắc chắn các kết nối được đồng thời từ phía khách hàng. Tôi cho rằng tôi có thể tcpdump để xem khi tôi recv SYN từ máy chủ mặc dù tôi không biết nếu đó là đủ. –
@hobbs: Làm cách nào để luồng Perl bị lỗi?Tổng thời gian CPU cho quá trình này là dưới 2 giây. –