2011-01-27 6 views
10

In un'implementazione tipica del server di rete C, la dimensione della coda in attesa può essere impostata con listen. Quando una nuova connessione aumenta e non c'è più spazio nella coda, ECONNREFUSED viene inviato al client o la richiesta viene ignorata.Conoscere la dimensione dell'accettazione delle code in sospeso in GNU/Linux

È un modo per conoscere lo stato di questa coda? È importante perché in un demone ad alto carico basato su eventi, stiamo rilevando alcuni tentativi dal client e sospettiamo che questa coda sia piena e che i tentativi di connessione vengano ignorati.

Grazie in anticipo.

+0

fa il client riceve un errore ECONNREFUSED? Se è così, hai la tua risposta. AFAIK non c'è modo di conoscere le dimensioni della coda in sospeso. – Simone

+0

Non esattamente. L'handshake non è terminato correttamente e il server va in tentativi inviando il SYNACK come l'ultimo ACK della stretta di mano è stato perso. Abbiamo riprodotto questo comportamento quando la coda in attesa di accettazione esce dal limite impostato con listen, quindi questa coda è il nostro sospetto. –

+0

Sei sicuro di accettare ogni connessione in entrata? – Simone

risposta

8

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

Numero massimo di richieste di connessione ricordati, che sono ancora non ha ricevuto un riconoscimento da collegamento cliente.

Il valore predefinito è 1024 per i sistemi con più di 128Mb di memoria e 128 per le macchine con poca memoria. Se il server soffre di sovraccarico, provare ad aumentare questo numero.

/proc/sys/net/core/somaxconn: Limite del backlog di ascolto() del socket, noto nello spazio utente come SOMAXCONN. Il valore predefinito è 128. Vedere anche tcp_max_syn_backlog per l'ottimizzazione aggiuntiva per i socket TCP.

queste sono le sysctl rilevanti .. su OpenBSD che sono seduto ora uno sysctl -a rapida rivela: net.inet.ip.maxqueue = 300

Problemi correlati