Piszki Lab

Analiza przypadku w języku przodków…

TCP/IP Exhaustion, czyli problem w Twojej sieci.

| 0 comments

Tradycyjnie, spora część środowisk wirtualnych jest oparta o system Microsoft Windows Server (jako podstawa dla wielu maszyn, w tym dla MsSQL i vCenter). Jest to zazwyczaj środowisko wysoce sprzęgnięte, dziesiątki usług i serwerów non stop ze sobą “rozmawia”. Jeśli dojdzie do tego np. duża ilość serwerów www, może dojść do dość męczącego zjawiska, jakim jest wyczerpywanie się pól dynamicznych portów TCP/IP na danych maszynach. Zjawisko jest bardzo trudne do wykrycia o ile nie dochodzi do nagminnego stanu przeciążenia (sam system operacyjny nie informuje o problemie, za to raportuje inne “problemy” będące już tylko skutkiem). W naszym przypadku doświadczaliśmy bardzo dziwnego zachowania serwerów Tomcat i JBoss które odpierały dziwne fale nadprogramowego (prawidłowego) ruchu. Na rozwiązanie doprowadziły nas komunikaty które serwował nam od jakiegoś czasu Trend Micro Deep Sucurity: TCP/IP Port Limit i UDP Port Limit, pojawiające się okazjonalnie w trakcie komunikacji pomiędzy przypadkowymi maszynami.

No więc czym jest TCP/IP Exhaustion? Przy dużej ilości połączeń do serwera Microsoft Windows (w dowolnej wersji) może dojść do wyczerpania puli dostępnych dynamicznych portów. Domyślnie jest ustawiona stosunkowo mała pula i duży czas oczekiwania na zwolnienie portu. Łatwo to sprawdzić poleceniem netstat –n, wszystkie połączenia ze statusem WAIT to właśnie te “zajęte” porty. W systemie Windows Server 2003 i 2008R2 parametr TIME WAIT to aż 240 sekund. W 2008R2 rozszerzono pulę (Ephemeral Ports) z ok 4K do 16K.

Jak i dlaczego warto się przed tym “bronić”? Wyobraźmy sobie sytuację w której kończą się porty na maszynie aplikacyjnej, efekt jest taki, że przez chwilę obserwujemy na maszynie “przycięcie” (zero ruchu sieciowego z braku wolnych portów) po czym po chwili przerwy nagłe uderzenie skolejkowanych pakietów powodujące przeciążenie i “wywrócenie” aplikacji.

Rozwiązanie jest proste, skracamy czas oczekiwania na zwolnienie portu:

W kluczu HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters dodajemy DWORD:

TcpTimedWaitDelay z parametrem 30 (decimal).

MaxUserPort z parametrem 65535 (decimal)

Tylko jedna uwaga do zakresu portów, koniecznie ale to koniecznie trzeba sprawdzić, czy zainstalowane na maszynie oprogramowanie (np. vCenter, Trend Micro etc etc) nie używa statycznie któregoś portu z wprowadzanego zakresu. Bez tego lekarstwo może być gorsze niż choroba Uśmiech

Edit: Te same ustawienia dotyczą też systemu Microsoft Server 2012R2

Oceń ten artykuł:
[Total: 0 Average: 0]

Dodaj komentarz

Required fields are marked *.