2010-03-15 25 views
6

Tất cả các ví dụ tôi đã thấy trong số sock.listen(5) trong tài liệu python đề nghị tôi nên đặt số backlog tối đa là 5. Điều này gây ra sự cố cho ứng dụng của tôi vì tôi đang mong đợi một số lượng rất lớn (nhiều kết nối đồng thời). Tôi đặt nó lên 200 và chưa thấy bất kỳ vấn đề nào trên hệ thống của mình, nhưng tôi tự hỏi tôi có thể đặt nó cao đến mức nào trước khi nó gây ra vấn đề ..Python sock.listen (...)

Có ai biết không?

Chỉnh sửa: Đây là vòng lặp accept() của tôi.

while True:  
    try: 
     self.q.put(sock.accept()) 
    except KeyboardInterrupt: 
     break 
    except Exception, e: 
     self.log("ERR %s" % e) 
+2

Một số thông tin tại đây: http://stackoverflow.com/questions/114874/socket-listen-backlog-parameter-how-to-determine-this-value –

+0

Tôi vừa kiểm tra giá trị của 'socket.SOMAXCONN' và nhận thấy '128' của nó, điều này sẽ giải thích lý do tại sao đặt giá trị thành 200 không hoạt động với' ab -c 200' (nó chỉ hoạt động cho đồng thời 120). – Ian

+0

Sử dụng self.q.put_nowait() để thay thế. –

Trả lời

8

Các doc nói điều này

socket.listen(backlog) Nghe kết nối thực hiện cho các ổ cắm. Đối số tồn tại xác định số lượng tối đa số kết nối được xếp hàng đợi và phải có ít nhất 1; giá trị tối đa phụ thuộc vào hệ thống (thường là 5).

Rõ ràng giá trị hệ thống lớn hơn 5 trên hệ thống của bạn. Tôi không thấy lý do tại sao đặt nó thành một số lớn hơn sẽ là một vấn đề. Có lẽ một số bộ nhớ được dành riêng cho mỗi kết nối được xếp hàng đợi.

trang người đàn ông linux của tôi có điều này để nói

Nếu đối số tồn đọng lớn hơn giá trị trong /proc/sys/net/core/somaxconn, sau đó nó đang âm thầm cắt ngắn để giá trị đó; giá trị mặc định trong tập tin này là 128. Trong hạt nhân trước 2.4.25, giới hạn này là một giá trị cứng mã hóa, SOMAXCONN, với giá trị 128.

+0

Chỉ cần kiểm tra trên osx, 'socket.SOMAXCONN' là 128 quá .. Kinda sucks, có nghĩa là số lượng tối đa hiện tại đang chờ kết nối là 128 .. Chắc chắn, đó là rất nhiều, nhưng cho bản chất ngắn/nhanh chóng của các yêu cầu này .. Tôi đang hy vọng có thêm sự tương tranh. – Ian

+0

Không, hạt nhân sẽ không thể yêu cầu kết nối ACK sau SOMAXCONN. Đây là hành vi mong muốn; nếu bạn đang thực sự nắm giữ hơn 128 yêu cầu kết nối xếp hàng bạn là a) mất quá nhiều thời gian để xử lý chúng hoặc b) cần một máy chủ phân tán nặng hoặc c) bị tấn công DDoS. – msw

+0

@Ian, trên linux bạn có thể 'echo 256>/proc/sys/net/core/somaxconn'. Tuy nhiên, bạn nên cố gắng làm cho trình xử lý của mình nhanh hơn trước khi bạn tăng số này bất kể số –

15

Bạn không cần phải điều chỉnh các tham số để listen() đến một số lớn hơn 5.

Tham số kiểm soát số lượng kết nối không phải là accept() được phép xuất sắc. Thông số listen() không mang về số lượng ổ cắm được kết nối đồng thời, chỉ trên số lượng kết nối đồng thời mà không được accept()-bởi quy trình.

Nếu điều chỉnh thông số thành listen() có tác động đến mã của bạn, đó là một triệu chứng xảy ra quá nhiều sự chậm trễ giữa mỗi cuộc gọi đến accept(). Sau đó bạn sẽ muốn thay đổi vòng lặp accept() của bạn sao cho nó có ít chi phí hơn.

Trong trường hợp của bạn, tôi đoán rằng self.q là một con trăn queue, trong trường hợp mà bạn có thể muốn gọi self.q.put_nowait() để tránh bất kỳ khả năng chặn các accept() vòng lặp tại cuộc gọi này.

+0

Nếu đó là sự thật thì có điều gì đó sai trái với 'ab', vì việc tăng kích thước' backlog' đã khắc phục được vấn đề của tôi. – Ian

+0

@Heath, có thể nếu có nhiều kết nối được thực hiện mỗi giây. Một backlog lớn sẽ cho phép bạn tandle tải thoáng qua tốt hơn –

+0

@Ian: "ab" là gì? Như tôi đã viết trong câu trả lời của tôi, nếu tăng backlog sửa chữa vấn đề của bạn, điều đó có nghĩa là bạn không gọi chấp nhận() thường xuyên, đủ để theo kịp với các kết nối đến. Mã accept() của bạn hoạt động như thế nào? –