W systemie Windows Server 2012 R2 zabrakło efemerycznych portów, choć nie powinno

13

Regularnie występują dziwne problemy z siecią na naszym dedykowanym serwerze. Działa z systemem Windows Server 2012 R2 x64 na Xeon E5620 z 16 GB pamięci RAM i kartą sieciową Intel 82575EB.

Pamiętaj, że już dostroiliśmy HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameterskluczowe wartości TcpTimedWaitDelayi MaxUserPortodpowiednio 30 i 65530.

W przypadkowym momencie nasze strony internetowe przestają odpowiadać, ponieważ nie mogą połączyć się z lokalną bazą danych. Problem zaczyna działać około 2 tygodni. Dziennik systemowy zaczyna otrzymywać ostrzeżenia 4227 i 4231 TCPIP. Napisano: „Żądanie przydzielenia efemerycznego numeru portu z globalnej przestrzeni portów TCP nie powiodło się z powodu użycia wszystkich takich portów”.

Jeśli ucieknę

Get-Counter -Counter \TCPv4\*

lub

Get-Counter -Counter \TCPv6\*

lub

netstat -abn | find /c ":"

Zawsze dostaję rozsądną wartość 500-1500 połączeń, co nie jest nawet bliskie limitowi 65K.

Ponadto „localhost” przestaje działać lokalnie na :: 1, powracając do 127.0.0.1
Tylko wymuszony restart komputera może rozwiązać sytuację.

Czy może to być problem z kartą sieciową?

AKTUALIZACJA 1

Zdarzyło się to ponownie i wydawało się, że problem został rozwiązany po ponownym uruchomieniu serwera poczty. Dziwne jednak, wszystkie liczniki pokazały ~ 1000 połączeń przy ~ 500 aktywnych w tej chwili, i nadal błąd gniazda 10055 podczas próby połączenia z bazą danych, która nie ma nic wspólnego z serwerem pocztowym.

AKTUALIZACJA 2 To dziwne, ale codzienne ponowne uruchamianie usług pocztowych całkowicie rozwiązuje problem.

CamaroSS
źródło
2
Informacje o AKTUALIZACJI 2. Oznacza to po prostu, że usługi pocztowe generują zbyt wiele połączeń bez ich zamykania, a ty nie rozwiązałeś problemu, ale po prostu ukryj go, aż stanie się gorzej, a 2 restarty dziennie będą wymagać pewnego czasu ... Wygląda na to, że raczej ukrywasz niż rozwiązujesz problem ...
Michaił

Odpowiedzi:

9

Miałem podobny problem z wyczerpaną pulą portów TCP / IP w WinSvr 2012R2 x64 przez prawie 1 miesiąc, gdy serwer przestał odbierać nowe połączenia i połączenia TCP. Grałem więc z wartościami rejestru, które są dla mnie stabilne:

[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 - powinien być w stanie domyślnym rozciągnięty do maksimum = 16777214 powinien zapobiegać wyczerpaniu się portów efemerycznych przez serwer.
  • TcpMaxDataRetransmissions - Limit czasu retransmisji TCP niepotwierdzonych segmentów danych przy rzeczywistym połączeniu = 5.

W rezultacie taki sam jak twój. Myślę, że powinieneś rozważyć kontrolę swojego zachowania wydajności aplikacji / skryptów. Jeśli wszystko jest w porządku i nic nie pomaga, możesz spróbować umieścić serwer proxy przed serwerem aplikacji WWW, utworzyć 2 węzły z serwerem sieci (IIS, Apache, ...), które będą współużytkować tę samą zawartość statyczną i uzyskiwać dostęp do tej samej bazy danych w tym samym czas (jeśli masz wystarczająco dużo zasobów w swojej firmie).

Może ten artykuł pomoże Ci w jakiś sposób: http://blogs.technet.com/b/tristank/archive/2008/03/11/maxuserport-what-it-is-what-it-does-when-it- s-important.aspx

MyKE
źródło
1
Powinieneś przeczytać pytanie dokładnie przed udzieleniem odpowiedzi. Oczywiście wypróbowałem to rozwiązanie przed zapytaniem, jest to bardzo powszechne. Problem rozwiązałem już w inny sposób.
CamaroSS
1
Myślę, że codzienne ponowne uruchamianie usług pocztowych nie rozwiązało problemu. Znalazłeś inne rozwiązanie?
MyKE
3
@CamaroSS: Udostępnij swoje rozwiązanie (jeśli wykracza to poza „ponowne uruchomienie usługi pocztowej” - to nie jest rozwiązanie). Być może powinieneś docenić to jeszcze bardziej, jeśli ktoś próbuje ci pomóc.
Sven
@CamaroSS A jeśli uważnie przeczytasz moją odpowiedź, zobaczysz „W rezultacie taki sam jak twój”, to opublikowałem kolejną informację ..
MyKE
1
Czy ustawienie MaxUserPortnadal działa w 2012 roku? Pomyślałem, że w 2012 r. Musisz to zrobić za pomocą narzędzia netsh. np .:netsh int ipv4 set dynamicport tcp start=25535 num=40000
rustyx,
4

Oprócz ustawień sterownika Tcpip, efemerycznym zakresem portów TCP zarządza się w systemie Windows Server za pomocą polecenia netsh ( źródło ).

Dynamiczny zakres portów można wyświetlić za pomocą następujących poleceń:

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

Aby zmienić zakres portów, użyj tego polecenia:

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

Na przykład:

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

Ustawienie (start = 49152 num = 16384 ) jest również domyślnym ustawieniem w systemie Windows Server 2008 i nowszych .

rustyx
źródło
Dziękuję bardzo za to - spędziłem już godziny na próbach rozwiązania mojego problemu. Wszystkie porady, które mogłem znaleźć, dotyczyły dostosowania MaxUserPort do rejestru i nikt nie wspomniał o netsh.
milosz
3

Miałem ten sam problem w systemie Windows Server 2016, uruchamiając duże ilości testów selenu przy użyciu narzędzia chromewebdriver. Ten skrypt PS automatycznie skonfiguruje ustawienia @Myke udostępnione powyżej. shutdownKomenda została dodana, ponieważ restart jest wymagany do zmiany stos TCP.

Zwiększ rozmiar puli dla efemerycznych portów TCP

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

To był komunikat o błędzie, który otrzymywaliśmy, Webdriver.Quit()informując nas, że używany jest adres TCP.

Błąd : EADDRINUSE connect EADDRINUSE 127.0.0.1:12843 w ClientRequest. (\ node_modules \ selenium-webdriver \ http \ index.js: 238: 15)
Od : Zadanie: WebDriver.quit ()

SliverNinja - MSFT
źródło
1

Czy upewniłeś się, że nie przeciekasz obiektów połączenia z bazą danych? Musisz zamknąć każde otwarte połączenie z bazą danych, jawnie (za pomocą try-wreszcie) lub za pomocą bloku using {}. Jest to częsty problem, o którym ASP nie mówi bezpośrednio.

James
źródło
To kilka stron PHP, większość z nich działa za pośrednictwem FastCGI przy użyciu trwałego połączenia, więc nie powinno tak być. Gdyby tak było, liczniki systemowe zwracałyby znacznie wyższe wartości. Nie potrafię też wyjaśnić, dlaczego localhost nagle przestaje przetwarzać na :: 1, a zamiast tego przyjmuje 127.0.0.1.
CamaroSS
2
:: 1 zniknięcie jest prawdopodobnie tylko efektem ubocznym przepełnienia dopuszczalnych portów - podejrzewam, że Windows próbuje pingować IPv6, a kiedy nie może uzyskać portu, aby wykonać próbę, wraca do IPv4. PHP jest poza moim obszarem specjalizacji. :-(. Powodzenia!
James