У нас есть Java-сервер, работающий в Linux на определенном порту, который принимает постоянные соединения для тысяч и тысяч пользователей. В последнее время наши клиенты не могут подключиться из-за ошибки тайм-аута. Мы подозреваем, что трафик становится слишком высоким, но наш журнал Java показывает, что не многие из них подключаются за секунду.
Мы подозреваем, что может быть слишком много попыток одновременно, и они в основном отбрасываются на уровне ОС, и, следовательно, у java-программы никогда не будет возможности принять соединение? Есть ли какой-то журнал в Linux, который может показать, что кто-то пытается попасть в сокет?
iptables -I INPUT -p tcp --dport some_port -j LOG
затем
tail -f /var/log/messages
После этого, чтобы увидеть, сколько данных было затронуто этим правилом: iptables -L -n -v
Или вы можете запустить tcpdump и удалить порты с помощью grep.
Когда у меня возникают серьезные проблемы с сетью, я обычно запускаю WireShark. Для меня нет лучшего инструмента диагностики сети, когда мне нужно перейти к мельчайшим деталям. И не беспокойтесь, если вы не можете установить его ни в исходный, ни в целевой ящик; Вы можете запустить tcpdump -w
для записи пакетных данных в файл в начальной и / или конечной точке и передачи файла в wirehark в другом окне, когда вам будет удобно.
watch -n1 -d "netstat -an | grep ESTABLISHED | wc -l"
показывает текущие установленные соединения.
Сравните это с вашим активным ulimit
настройки и, конечно же, максимальное количество подключений, которое может обрабатывать ваше Java-приложение.
Было бы хорошо увидеть, что именно получают ваши потоки Java на уровне сокета. В то же время вы хотели бы связать это с информацией о сети ОС. Взгляните на AppFirst. Они могут делать такие вещи.