2010-03-09 36 views
6

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ế.

+1

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

+0

@ 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à đủ. –

+1

@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. –

Trả lời

7

Xin vui lòng sửa tôi tóm tắt này là không chính xác:

  • client multi-threaded của bạn sẽ bắt đầu một thread kết nối đến máy chủ và các vấn đề chỉ là một HTTP GET sau đó chủ đề đó đóng cửa.
  • Khi bạn nói 1, 2, 5, 10, 50 chuỗi, bạn chỉ đề cập đến số lượng chuỗi đồng thời bạn cho phép, mỗi chuỗi chỉ xử lý một yêu cầu
  • Khách hàng của bạn mất từ ​​2 đến 5 phút để tải xuống hơn 1000 hình ảnh
  • Firefox và Opera sẽ tải một dữ liệu tương đương với thiết lập trong 40 giây

tôi đề nghị rằng các máy chủ tốc độ hạn http kết nối, hoặc bằng daemon webserver chính nó, một tường lửa máy chủ cục bộ hoặc có khả năng nhất tường lửa chuyên dụng.

Bạn đang thực sự lạm dụng dịch vụ web bằng cách không sử dụng lại kết nối HTTP cho nhiều yêu cầu và thời gian chờ mà bạn gặp phải là do bạn đang bị kẹp SYN FLOOD.

Firefox và Opera có thể đang sử dụng từ 4 đến 8 kết nối để tải xuống tất cả các tệp.

Nếu bạn thiết kế lại mã để sử dụng lại các kết nối, bạn sẽ đạt được hiệu suất tương tự.

+0

@MattH: +1 Nói chung, tôi nghi ngờ rằng bạn đã chính xác về thời gian chờ được thực hiện đối với tường lửa nhận thấy 'SYN FLOOD'. Tuy nhiên, tôi sẽ không đồng ý với quan điểm của bạn về sự ngược đãi vì hai lý do. Tiêu chuẩn 'HTTP/1.1' ** không yêu cầu khách hàng hỗ trợ các kết nối liên tục. Khách hàng có tùy chọn sử dụng tiêu đề 'Connection: close'. Thứ hai, trang web liệt kê tất cả 1300 hình thu nhỏ trên một trang web duy nhất. Nếu bạn không sẵn sàng phân phát nhiều hình ảnh đó cho một khách hàng duy nhất qua các kết nối không liên tục thì hãy chia nhỏ nó thành nhiều trang. Tôi có thể sẽ thử kết nối liên tục. –

+0

@MattH: Có một luồng thread của N luồng, mỗi luồng có chính xác một kết nối TCP mở tại một thời điểm cho N kết nối TCP đồng thời. Pipelining hiện không được sử dụng, vì vậy mỗi kết nối được sử dụng để tải xuống một tệp. –

+0

@Robert: Bạn không phải độc hại để lạm dụng thứ gì đó. Bạn không phải là nhà phân tích mạng hoặc quản trị viên máy chủ để đưa trang web lên hàng nghìn hình ảnh trên đó. Thông số HTTP 1.1 nói rằng việc triển khai 'NÊN thực hiện kiên trì. Mở một nghìn kết nối mỗi phút với máy chủ web không hiệu quả (như bạn đã phát hiện khi đặt câu hỏi này) và vẫn IMO lạm dụng. Xác nhận của bạn rằng "lưu trữ trang với hình ảnh 1300" ngụ ý "máy chủ PHẢI hỗ trợ 1300 lần thử kết nối đồng thời từ một máy chủ duy nhất" sẽ không giữ với bất kỳ quản trị viên máy chủ nào. – MattH