2011-01-27 29 views
10

Trong triển khai máy chủ mạng C điển hình, kích thước của hàng chờ chấp nhận đang chờ xử lý có thể được đặt bằng listen. Khi thu nhập kết nối mới và không còn khoảng trống trong hàng đợi, ECONNREFUSED sẽ gửi cho khách hàng hoặc yêu cầu bị bỏ qua.Biết kích thước của hàng đợi kết nối đang chờ chấp nhận trong GNU/Linux

Có cách nào để biết trạng thái của hàng đợi này không? Điều quan trọng bởi vì trong một daemon dựa trên sự kiện tải cao, chúng tôi đang phát hiện một số lần thử lại từ máy khách và chúng tôi nghi ngờ rằng hàng đợi này đầy và các kết nối sẽ bị bỏ qua.

Xin cảm ơn trước.

+0

Liệu khách hàng nhận được một lỗi ECONNREFUSED? Nếu có, bạn có câu trả lời. AFAIK không có cách nào để biết kích thước của hàng đợi đang chờ xử lý. – Simone

+0

Không chính xác. Cái bắt tay không được hoàn thành một cách chính xác và máy chủ đi vào thử lại gửi SYNACK như ACK cuối cùng của cái bắt tay đã bị mất. Chúng tôi đã sao chép hành vi này khi hàng đợi đang chờ chấp nhận đi ra khỏi giới hạn được đặt bằng cách nghe, vì vậy hàng đợi này là nghi phạm của chúng tôi. –

+0

Bạn có chắc chắn chấp nhận mọi kết nối đến không? – Simone

Trả lời

8

trong linux: /proc/sys/net/ipv4/tcp_max_syn_backlog:

Số lượng tối đa các yêu cầu kết nối nhớ, mà vẫn không nhận được một sự thừa nhận từ kết nối khách hàng.

Giá trị mặc định là 1024 cho hệ thống có hơn 128Mb bộ nhớ và 128 cho các máy bộ nhớ thấp. Nếu máy chủ bị quá tải, hãy thử tăng số này.

/proc/sys/net/core/somaxconn: Giới hạn của socket listen() backlog, được biết đến trong không gian người dùng là SOMAXCONN. Mặc định là 128. Xem thêm tcp_max_syn_backlog để điều chỉnh bổ sung cho các cổng TCP.

đây là những sysctls liên quan .. trên OpenBSD mà tôi đang ngồi tại một sysctl -a nhanh chóng cho thấy: net.inet.ip.maxqueue = 300

Các vấn đề liên quan