Mamy serwer Java działający w systemie Linux na określonym porcie, który przyjmuje stałe połączenia dla tysięcy użytkowników. Ostatnio nasi klienci nie mogą połączyć się z błędem przekroczenia limitu czasu. Podejrzewamy, że ruch jest zbyt duży, ale nasz dziennik Java pokazuje, że niewielu jest podłączonych w ciągu sekundy.
Podejrzewamy, że może być tak, że zbyt wielu próbuje jednocześnie i są one po prostu odrzucane na poziomie systemu operacyjnego, a zatem program Java nigdy nie ma szansy na zaakceptowanie połączenia? Czy istnieje jakiś rodzaj logowania w systemie Linux, który może pokazać, że ktoś próbuje trafić w gniazdo?
iptables -I INPUT -p tcp --dport some_port -m state --state NEW
. Pamiętaj, że jeśli nie jesteś zainteresowany szczegółami każdej próby połączenia, pominięcie-j LOG
pozwala uniknąć spamowania pliku dziennika systemu z dużą ilością niepotrzebnych danych.Kiedy mam naprawdę paskudne problemy z siecią, odpalam wireshark . Dla mnie nie ma lepszego narzędzia do diagnostyki sieci, gdy muszę przejść do drobiazgowych szczegółów. I nie martw się, jeśli nie możesz zainstalować go na polu źródłowym lub docelowym; możesz uruchomić
tcpdump -w
zapisywanie danych pakietowych do pliku na początku i / lub punkcie końcowym, a także przesłać plik do wireshark na innym polu w dogodnym dla Ciebie czasie.źródło
tcpdump -nS dst port <some port>
Dobrze byłoby zobaczyć dokładnie, jakie są twoje wątki Java na poziomie gniazda. Jednocześnie chcesz skorelować to z informacjami o sieci systemu operacyjnego. Spójrz na AppFirst. Mogą robić takie rzeczy.
źródło
pokazuje aktualnie ustanowione połączenia.
Porównaj to z aktywnymi
ulimit
ustawieniami i oczywiście z maksymalną liczbą połączeń obsługiwanych przez aplikację Java.źródło