2013-07-04 7 views
7

Występuje problem polegający na odmawianiu przychodzących połączeń gniazd klienta z naszym serwerem gniazd, gdy jest względnie mały liczba węzłów (16 do 24, ale będziemy musieli obsłużyć więcej w przyszłości) próbują połączyć się jednocześnie.Połączenia z gniazdami klientów odrzucane przez serwer na hoście systemu Windows dla małych liczb (16 <x <24) prób połączenia próbnego połączenia klienta

Niektóre specyfiki:

  • serwer jest uruchomiony w systemie Windows 2008 lub 7
  • nasz główny serwer jest napisany w języku Java z wykorzystaniem ServerSocket
  • klienci są również system Windows działa na węzłach siatki w naszym centrum danych

Kiedy próbujemy wykonać test na siatce, węzły klienta próbują połączyć się z serwerem i wysłać pakiet 40-100K, a następnie zrzucić połączenie. Korzystając z od 16 do 24 węzłów, zaczynamy dostrzegać problemy z połączeniami klientów, które nie mogą połączyć się z serwerem. Biorąc pod uwagę tę konfigurację, próbujemy potencjalnie obsłużyć maksymalnie 16-24 równoczesnych połączeń klienckich i błędów, co nie wydaje się nam w ogóle właściwe.

Główna pętla serwera nasłuchuje na zwykłym serwerze SocketServer, a po uzyskaniu połączenia uruchamia nowy wątek, aby obsłużyć połączenie, natychmiast powraca do nasłuchu na gnieździe. Mamy również dummy serwer Pythona, który po prostu odczytuje i odrzuca dane przychodzące oraz serwer C++, który rejestruje dane przed ich zrzuceniem i oba mają ten sam problem z klientami, którzy nie mogą się połączyć z niewielkimi zmianami liczby udanych połączeń klienta przed awarie się zaczynają. Doprowadziło to nas do przekonania, że ​​żaden konkretny serwer nie ponosi winy w tym zakresie i że prawdopodobnie jest to środowisko.

Naszą pierwszą myślą było zwiększenie zaległości TCP na gnieździe. Nie pomogło to w rozwiązaniu problemu, nawet przy bardzo wysokim poziomie. Domyślnie dla Java SocketServer jest 50, dużo mniej niż jesteśmy w stanie obsłużyć.

Uruchomiliśmy test między maszynami w tej samej podsieci i wyłączyliśmy wszystkie lokalne zapory na komputerach, na wypadek, gdyby FW ograniczało nasze połączenia z serwerem; bez powodzenia.

Próbowaliśmy trochę dostrajanie sieci na komputerze z systemem Windows uruchomione serwery:

  • zmniejszając TimedWaitDelay, ale bez skutku (aw moim teście Python nie powinno, bo to prowadzi tylko do testu kilka milisekund).
  • Zwiększenie MaxUserPort do dużej wartości, około 65000, ale bez efektu (co jest dziwne, ponieważ mój test w Pythonie wysyła tylko 240 wiadomości, więc nie powinienem nawet zbliżać się do tego rodzaju limitu).
  • Zwiększenie wartości TcpNumConnection do dużej wartości (nie pamiętamy dokładnej liczby). Ponownie, nigdy nie powinniśmy mieć więcej niż 24 połączenia naraz, więc nie może to być limit.
  • Uruchamianie funkcji "Dynamiczne zaległości", która pozwala na dynamiczny wzrost liczby zalegających wiadomości. Myślę, że ustawiliśmy maksimum na 2000 połączeń z min 1000 połączeń, ale bez skutku. Python nigdy nie powinien tworzyć więcej niż 240 połączeń, więc nie powinniśmy nawet aktywować dynamicznego zaległości.
  • Oprócz powyższego wyłączenia "automatycznego dostrajania" systemu Windows dla portów TCP. Ponownie, bez efektu.

Mam wrażenie, że system Windows w jakiś sposób ogranicza liczbę połączeń przychodzących, ale nie jesteśmy pewni, co zmodyfikować, aby umożliwić większą liczbę połączeń. Myśli agenta w sieci ograniczające szybkość połączenia również nie wydają się być prawdziwe. Bardzo wątpimy, że liczba jednoczesnych połączeń jest przeciążona fizyczną siecią GB.

Jesteśmy zaskoczeni. Czy ktokolwiek inny napotkał taki problem i znalazł rozwiązanie?

+0

Mam podobny problem z profesjonalną edycją systemu Windows 7. Próbowałem wszystkich wyżej wymienionych kroków. Wypróbowane ustawienia wymienione w http://smallvoid.com/article/winnt-tcpip-max-limit.html i http://kb.globalscape.com/KnowledgebaseArticle10438.aspx. Próbowałem wyłączyć SynAttackProtect (chociaż nie ma to wpływu na Win7, jak na http://msdn.microsoft.com/en-us/library/ee377058%28BTS.10%29.aspx). Czy udało Ci się rozwiązać ten problem? – hackrock

+0

Mówi się, że połowa otwartego limitu połączeń została usunięta w Win 7, ale czy istnieje limit dla połączeń przychodzących? Mogę z powodzeniem zainicjować 200 żądań na sekundę dla serwera, dopóki jest on połączony z powrotem i NIE współbieżnie. – hackrock

Odpowiedz

1

Sprawdziłbym, ile połączeń jest w stanie TIME_WAIT połączenia TCP. Widziałem tego typu problem z powodu wielu połączeń jest otwarte/zamknięte powodując wyczerpanie gniazda ze względu na TIME_WAIT. Aby to sprawdzić, należy uruchomić:

netstat -a 
1

IIS jest znany do obsługi dużej liczby jednoczesnych połączeń przychodzących - znacznie większa niż limit jesteś doświadcza - co środowisko mało prawdopodobne źródło.

Jeśli, jak sam wskazywałeś, zwiększenie zaległości TCP nie poprawi sytuacji, problem musi rzeczywiście występować w działaniu accept(). Nie wskazujesz, czy klienci otrzymują różnego rodzaju błędy, czy coś spójnego. Limity czasu by to poparły, a odrzucenia wskazywałyby, że zaległości nie są przetwarzane wystarczająco szybko.

Czy jesteś w stanie spróbować prototypować aplikację jako hosta ASPX, aby lepiej zrozumieć problem?

+0

Zwiększono rejestrację wsteczną do 64. Zainicjowano pakiet 20 połączeń z serwerem.Odmówiono połączenia na więcej niż 10 żądań za każdym razem, gdy testowałem. Przetestowałem również przy użyciu Hercules (http://www.hw-group.com/products/hercules/index_en.html) i odkryłem podobne zachowanie. Za każdym razem jest to ten sam błąd, tj. RST wskazujące na odmowę połączenia. – hackrock

+0

RST w połączeniu z zaległości wskazuje na coś ciekawego. Czy jesteś w stanie dostarczyć ślad sieciowy komunikacji? Jak uzyskać narzędzie do generowania wielu połączeń? – Pekka

1

Najprawdopodobniej jesteś ograniczony przez system operacyjny; czy w dziennikach systemowych pojawia się komunikat o błędzie 4226?

systemu Windows ogranicza liczbę współbieżne prób połączenia do (chyba) 10 połączeń/s - w zależności od wersji OS (wersje serwerowe mieć wartość do 50)

w celu wyeliminowania, że masz dwie możliwości:

  • bezpośrednio edytować tcpip.sys w system32/drivers w edytorze hex - żartuję :)

  • spróbować edytować [HKEY_LOCAL_MACHINE \ st Pozycja \ M \ CurrentControlSet \ Services \ Lanmanserver \ Parameters \ MaxMpxCt (Domyślnie = 10 poleceń).

Możesz także spróbować this hotfix w przypadku używasz wersji, która nie pozwala na ustawienie tego parametru.

Możesz także wypróbować różne rzeczy, takie jak maksymalna liczba TCB używanych przez system operacyjny, zakres portów do dynamicznego przydzielania portów, itp. - chociaż te wartości są wystarczająco wysokie dla twoich potrzeb.

+0

Znalazłem artykuł opisujący podobny problem z serwerem plików: http://blogs.citrix.com/2010/10/21/smb-tuning-for-xenapp-and-file-servers-on-windows- server-2008/- Myślę, że powód jest taki sam. –

+0

Nie sądzę, że jest to związane z połączeniem z gniazdem – hackrock

Powiązane problemy