Windows Server 2012 R2 esaurisce le porte temporanee, anche se non dovrebbe


13

Stiamo riscontrando regolarmente strani problemi con la rete sul nostro server dedicato. Funziona con Windows Server 2012 R2 x64 su Xeon E5620 con 16 GB di RAM e scheda di rete Intel 82575EB.

Si noti che abbiamo già regolato HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parametersi valori chiave TcpTimedWaitDelaye rispettivamente MaxUserPortsu 30 e 65530.

In un momento casuale i nostri siti Web smettono di rispondere, il motivo è che non possono connettersi a un database locale. Sono circa 2 settimane di attività quando iniziano a verificarsi questi problemi. Il registro di sistema inizia a ricevere gli avvisi TCPIP 4227 e 4231. Indica "Una richiesta di allocare un numero di porta temporaneo dallo spazio della porta TCP globale non è riuscita a causa di tutte queste porte in uso.".

Se corro

Get-Counter -Counter \TCPv4\*

o

Get-Counter -Counter \TCPv6\*

o

netstat -abn | find /c ":"

Ottengo sempre un valore ragionevole di 500-1500 connessioni, che non è nemmeno vicino al limite di 65 KB.

Inoltre, "localhost" interrompe la risoluzione a :: 1 localmente, ripristinando 127.0.0.1
Solo un riavvio forzato della macchina può risolvere la situazione.

Potrebbe essere un problema con la scheda di rete?

AGGIORNAMENTO 1

È successo di nuovo e sembrava essere stato risolto quando ho riavviato il server di posta. Stranamente, tutti i contatori hanno mostrato ~ 1000 connessioni con ~ 500 al momento attive, e ancora l'errore del socket 10055 quando si tenta di connettersi al database che non ha nulla a che fare con il server di posta.

AGGIORNAMENTO 2 Questo è strano, ma il riavvio giornaliero dei servizi di posta risolve completamente il problema.



2
Informazioni sull'aggiornamento 2. Quindi questo indica semplicemente che i servizi di posta generano troppe connessioni senza chiuderle e non hai risolto il problema, ma nascondilo fino a quando non peggiora e saranno necessari 2 riavvii al giorno ... Sembra nascondersi piuttosto che risolvere problema ...
Mikhail,

Risposte:


9

Ho avuto un problema simile con il pool esaurito di porte TCP / IP su WinSvr 2012R2 x64 per quasi 1 mese in cui il server ha smesso di ricevere nuove connessioni TCP e. Quindi ho giocato con i valori di registro e questi sono stabili per me:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e
"MaxUserPort"=dword:0000fffe
"TcpNumConnections"=dword:00fffffe
"TcpMaxDataRetransmissions"=dword:00000005
  • TcpTimedWaitDelay - 30
  • MaxUserPort - 65534
  • TcpNumConnections - dovrebbe essere nello stato predefinito allungato al massimo = 16777214 dovrebbe impedire al server di esaurire le porte effimere.
  • TcpMaxDataRetransmissions - Limite di timeout della ritrasmissione di segmenti di dati TCP non riconosciuti sulla connessione effettiva = 5.

Di conseguenza, uguale al tuo. Penso che dovresti considerare di controllare il tuo comportamento delle prestazioni delle tue applicazioni / script. Se tutto è ok e nulla aiuta, allora puoi provare a mettere il server proxy davanti al tuo server delle applicazioni web, creare 2 nodi con il server web (IIS, Apache, ...) che condivideranno lo stesso contenuto statico e accederanno allo stesso database allo stesso tempo (se hai abbastanza risorse nella tua azienda).

Forse questo articolo potrebbe aiutarti in qualche modo: http://blogs.technet.com/b/tristank/archive/2008/03/11/maxuserport-what-it-is-what-it-does-when-it- s-important.aspx


1
Avresti dovuto leggere attentamente la domanda prima di rispondere. Naturalmente ho provato questa soluzione prima di chiedere, è molto comune. Ho già risolto il problema con un altro mezzo.
CamaroSS,

1
Penso che il riavvio quotidiano dei servizi di posta non sia risolto problema. Hai trovato un'altra soluzione?
MyKE,

3
@CamaroSS: si prega di condividere la soluzione (se va oltre il "riavvio del servizio di posta" - questa non è una soluzione). Inoltre, forse dovresti apprezzarlo un po 'di più se qualcuno cerca di aiutarti.
Sven

@CamaroSS E se leggi attentamente la mia risposta vedrai "In risultato uguale al tuo", allora ho postato un'altra informazione ..
MyKE

1
L'impostazione MaxUserPortfunziona ancora nel 2012? Nel 2012 ho pensato che dovevi farlo tramite Netsh. ad es .:netsh int ipv4 set dynamicport tcp start=25535 num=40000
rustyx,

4

Oltre alle impostazioni del driver Tcpip, l'intervallo di porte TCP effimere è gestito in Windows Server utilizzando il comando netsh ( sorgente ).

È possibile visualizzare l'intervallo di porte dinamico con i seguenti comandi:

  • netsh int ipv4 show dynamicport tcp
  • netsh int ipv4 show dynamicport udp
  • netsh int ipv6 show dynamicport tcp
  • netsh int ipv6 show dynamicport udp

Per modificare l'intervallo di porte, utilizzare questo comando:

  • netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

Per esempio:

netsh int ipv4 set dynamicport tcp start=49152 num=16384

L'impostazione (inizio = 49152 num = 16384 ) è anche l' impostazione predefinita da Windows Server 2008 in poi.


Grazie mille per questo - ho già passato ore a cercare di risolvere il mio problema. Tutti i consigli che ho potuto trovare riguardavano la regolazione di MaxUserPort nel registro e nessuno ha menzionato netsh.
milosz,

3

Aveva lo stesso problema su Windows Server 2016 che eseguiva grandi quantità di test del selenio usando chromewebdriver. Questo script PS configurerà automaticamente le impostazioni @Myke condivise sopra. Il shutdowncomando è stato aggiunto perché è necessario un riavvio per le modifiche allo stack TCP.

Aumenta le dimensioni del pool per le porte TCP effimere

Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name MaxUserPort -Value 65534 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpTimedWaitDelay -Value 30 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpNumConnections -Value 16777214 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpMaxDataRetransmissions -Value 5 -Force | Out-Null

shutdown -r -t 0

Questo era il messaggio di errore che stavamo ricevendo Webdriver.Quit()dicendoci che era in uso un indirizzo TCP.

Errore : EADDRINUSE collega EADDRINUSE 127.0.0.1:12843 su ClientRequest. (\ node_modules \ selenium-webdriver \ http \ index.js: 238: 15)
Da : Attività: WebDriver.quit ()


1

Ti sei assicurato di non perdere oggetti di connessione al database? Devi chiudere ogni connessione al database che viene aperta, esplicitamente (con try-finally) o con un blocco using {}. Questo è un problema comune di cui ASP non ti dirà direttamente.


È un gruppo di siti PHP, molti dei quali sono in esecuzione tramite FastCGI utilizzando una connessione persistente, quindi non dovrebbe essere così. In tal caso, i contatori di sistema restituirebbero valori molto più alti. Inoltre, non riesco a spiegare perché localhost si interrompe improvvisamente per risolvere a :: 1 e si risolve invece in 127.0.0.1.
CamaroSS,

2
:: La scomparsa di 1 è probabilmente solo un effetto collaterale del trabocco delle porte consentite: sospetto che Windows provi un ping IPv6 e quando non riesce a ottenere una porta per fare il tentativo, ricade su IPv4. PHP è al di fuori delle mie aree di competenza. :-(. Buona fortuna!
James,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.