2011-01-27 10 views
10

W typowej implementacji serwera sieci C rozmiar akceptowanej kolejki oczekującej można ustawić za pomocą listen. Kiedy nowe połączenie przychodzi i nie ma już miejsca w kolejce, ECONNREFUSED jest wysyłane do klienta lub żądanie jest ignorowane.Zna rozmiar akceptowanej oczekującej kolejki połączeń w systemie GNU/Linux

Czy można poznać stan tej kolejki? Jest to ważne, ponieważ w demona opartym na zdarzeniu z dużym obciążeniem wykrywamy kilka prób od klienta i podejrzewamy, że ta kolejka jest pełna, a próby połączenia są ignorowane.

Z góry dziękuję.

+0

Czy klient otrzyma ECONNREFUSED błąd? Jeśli tak, masz odpowiedź. AFAIK nie ma możliwości poznania rozmiaru oczekującej kolejki. – Simone

+0

Niezupełnie. Uzgadnianie nie zostało poprawnie zakończone, a serwer przechodzi w ponowną próbę wysłania SYNACK, tak jak utracono ostatnie potwierdzenie ACK. Powieliliśmy to zachowanie, gdy oczekująca kolejka oczekująca wychodzi z limitu ustawionego za pomocą nasłuchiwania, więc ta kolejka jest naszym podejrzanym. –

+0

Czy na pewno akceptujesz każde połączenie przychodzące? – Simone

Odpowiedz

8

w systemie Linux: /proc/sys/net/ipv4/tcp_max_syn_backlog:

Maksymalna ilość pamiętanych żądań połączeń, które nadal nie otrzymał potwierdzenia z podłączeniem klienta.

Wartość domyślna to 1024 dla systemów z więcej niż 128 MB pamięci i 128 dla urządzeń o niskiej pamięci. Jeśli serwer jest przeciążony, spróbuj zwiększyć tę liczbę.

/proc/sys/net/core/somaxconn: Limit odsłuchu socket() znany w przestrzeni użytkownika jako SOMAXCONN. Domyślne ustawienie to 128. Zobacz także tcp_max_syn_backlog, aby uzyskać dodatkowe tuningowanie gniazd TCP.

są odpowiednie sysctls .. na OpenBSD, że siedzę teraz szybkie sysctl -a ujawnia: net.inet.ip.maxqueue = 300

Powiązane problemy