У нас есть Java-сервер, работающий в Linux на определенном порту, который принимает постоянные соединения для тысяч и тысяч пользователей. В последнее время наши клиенты не могут подключиться с ошибкой тайм-аута. Мы подозреваем, что трафик становится слишком высоким, но наш журнал Java показывает, что не многие подключаются в секунду.
Мы подозреваем, что, может быть, слишком многие пытаются одновременно, и они в основном отбрасываются на уровне операционной системы, и, следовательно, у java-программы никогда не будет возможности принять соединение? Есть ли какой-нибудь журнал в Linux, который может показать, что кто-то пытается попасть в сокет?
iptables -I INPUT -p tcp --dport some_port -m state --state NEW
. Обратите внимание, что если вы не заинтересованы в деталях каждой попытки подключения, опускание-j LOG
позволяет избежать спама в системном журнале с большим количеством ненужных данных.Когда у меня действительно неприятные проблемы с сетью, я обычно запускаю wireshark . Для меня нет лучшего инструмента диагностики сети, когда мне нужно детально разобраться в деталях. И не беспокойтесь, если вы не можете установить его ни на источник, ни на место назначения; вы можете запустить,
tcpdump -w
чтобы записать пакетные данные в файл в начальной и / или конечной точке и передать файл в wireshark на другом устройстве.источник
tcpdump -nS dst port <some port>
Было бы хорошо увидеть, что именно ваши потоки Java получают на уровне сокетов. В то же время вы хотите соотнести это с информацией о сети ОС. Взгляните на AppFirst. Они могут делать такие вещи.
источник
показывает установленные в данный момент соединения.
Сравните это с вашими активными
ulimit
настройками и, конечно, с максимальным количеством соединений, которое может обработать ваше Java-приложение.источник