Domanda

La nostra applicazione server è in ascolto su una porta e dopo un certo periodo di tempo non accetta più connessioni in entrata. (E mentre mi piacerebbe risolvere questo problema, non è quello che sto chiedendo qui;)

Lo strano è che quando la nostra app smette di accettare connessioni sulla porta 44044, anche IIS (sulla porta 8080). Uccidere la nostra app risolve tutto: IIS inizia a rispondere di nuovo.

Quindi la domanda è: un'applicazione può incasinare l'intero stack TCP / IP? O forse, come può un'applicazione farlo?

Dettagli senza senso: la nostra app è scritta in C #, sotto .Net 2.0, su XP / SP2.

Chiarimento: IIS non " rifiuta " i tentativi di connessione. Non li vede mai. I clienti stanno ottenendo un server "non ha risposto in modo tempestivo" messaggio (utilizzando il client .Net TCP.)

È stato utile?

Soluzione

Potresti star morendo di fame. È abbastanza facile drenare in un ambiente aperto / chiuso al secondo ambiente ad es. server web che serve molte richieste non raggruppate.

Questo è esaurito dal ritardo TIME-WAIT predefinito: la quantità di tempo in cui un socket deve essere chiuso prima di essere riciclato è impostato su 90s (se ricordo bene)

Ci sono un sacco di chiavi di registro che possono essere modificate - suggerisci che almeno le seguenti chiavi sono create / modificate

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

TcpTimedWaitDelay = 30
MaxUserPort = 65534 
MaxHashTableSize = 65536 
MaxFreeTcbs = 16000 

Un sacco di documenti su MSDN e amp; Technet sulla funzione di questi tasti.

Altri suggerimenti

Non hai raggiunto il limite massimo degli handle di porta disponibili?
     netstat -a

Ho visto qualcosa di simile quando un'app apriva e chiudeva le porte (ma in realtà non le chiudeva correttamente).

Usa netstat -a per vedere le connessioni attive quando ciò accade. Forse, l'app del server non sta chiudendo / eliminando connessioni "chiuse".

Buoni suggerimenti da parte di tutti, grazie per il vostro aiuto.

Quindi, ecco cosa stava succedendo: Si scopre che avevamo diversi servizi in competizione per lo stesso porto e il più delle volte il "corretto" il servizio otterrebbe il porto. Di tanto in tanto un secondo servizio prenderebbe via il porto e il primo servizio proverebbe ad aprire un altro porto. Da quel momento in poi, i servizi continuerebbero ad afferrare nuove porte ogni volta che soddisfacessero una richiesta (poiché non stavano usando le loro porte preferite) e alla fine esauriremmo tutte le porte disponibili.

Ovviamente, la vera domanda era: "Un'applicazione può rovinare l'intero stack TCP / IP?" e la risposta a questa domanda è: Sì. Un modo per farlo è ascoltare un sacco di porte.

Suppongo che il commento sul numero di porta di RichS sia corretto.

Oltre a ciò, lo stack TCP / IP è solo un modulo nel sistema operativo e, come tale, può contenere bug che potrebbero consentire a un'applicazione di ucciderlo. Non sarebbe il primo pilota ad essere ucciso da un programma.

(Un suggerimento per Andrew Tanenbaum per aver insistito sul fatto che i sistemi operativi dovrebbero essere modulari anziché monolitici.)

Sono stato anche io in un paio di situazioni simili. Un buon passaggio per la risoluzione dei problemi è tentare una connessione dalla macchina interessata a una destinazione ben nota che in quel momento non presenta problemi di connettività. Se il tentativo di connessione fallisce, è molto probabile che tu ottenga dettagli più interessanti nel messaggio / codice di errore. Ad esempio, si potrebbe dire che non ci sono abbastanza handle o memoria.

Dal punto di vista dell'amministratore di supporto e di sistema, l'ho visto solo nelle occasioni più rare (più di una volta), ma certamente può succedere.

Quando si diagnostica il problema, è necessario eliminare attentamente le possibili cause, anziché riavviare ciecamente il sistema al primo segnale di guasto. Lo dico solo perché molti clienti con cui lavoro sono tentati di farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top