Привет!
Есть невероятно криво написанное серверное приложение (гремучая смесь Scala и Java, JVM, в общем, приправленное кучей библиотек).
Есть там какая-то утечка. Открываются какие-то сокеты, и потом не закрываются. Когда они заканчиваются, оно предсказуемо падает с too many open files.
Это мало кого смущает в этом бессмысленном беспощадном мире облачных вычислений. Сервер просто заменяется каким-то демоном после того как перестаёт отвечать на запросы и всё. И работает дальше. До следующего падения.
Но мне не даёт покоя, хочу разобраться, что же там внутри такое происходит. Где именно ошибка, драйвер ли это базы данных, или какой-то HTTP-клиент, или HTTP-сервер. Для своего саморазвития хочу больше разобраться.
Команда lsof -p pid выдаёт невероятное число строчек с «Can’t identify protocol».
java (pid) (пользователь) *000u sock 0,8 0t0 (номер) can't identify protocol
Если точнее, то
lsof -p pid | grep -c "can't identify protocol"
Выдаёт огромное число, более 65000.
Что дальше тут можно раскопать? Как определить всё-таки протокол? Если это TCP, то можно ли как-то, например, узнать, удалённый IP-адрес и порт, к которому эта программа подключается, если это клиентский сокет? Или это может быть и серверный?