Ошибка указывает, что вызов accept()
не может принять соединение через сокет.Согласно документации базового системного вызова , есть две возможные причины этого исключения: либо у вас слишком много открытых файлов в вашем процессе, либо слишком много открытых файлов в масштабе всей системы.
возможно , что слишком много открытых соединений.Вы можете использовать netstat -anp | grep TOMCAT_PROCESS_ID
, чтобы посмотреть, сколько подключений связано с сервером Tomcat.Это будет включать в себя входящие соединения от клиента, а также исходящие соединения из вашего веб-приложения с внешними сервисами;входящие соединения покажут порт Tomcat в качестве пункта назначения.Если у вас много входящих подключений, то это проблема слишком большого количества клиентов или клиентов, которые не закрывают соединение (что, по-видимому, делает ваш пример).
Скорее всего, вы не правильнозакрытие файлов в вашем веб-приложении (которое вы развернули на сервере Tomcat).Чтобы диагностировать, я бы запустил ls -l /proc/TOMCAT_PROCESS_ID/fd
, который даст вам список всех файлов и сокетов, которые открываются этим процессом.В этом списке вы увидите WAR приложения и некоторые JAR-файлы, используемые Tomcat.Если вы видите много файлов из вашей файловой системы, посмотрите, где они открыты.