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?
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
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