Утечка памяти Tomcat 9 с объединением HttpClientConnectionManager и NioEndpoint

#multithreading #tomcat #threadpool #tomcat9 #apache-httpclient-5.x

#многопоточность #tomcat #пул потоков #tomcat9 #apache-httpclient-5.x

Вопрос:

Я пытаюсь проанализировать скачок процессора и памяти в моей системе в kubernetes pods. После запуска нагрузочного теста, когда использование памяти не уменьшилось, я взял дамп кучи и проанализировал с помощью MAT. Основной подозреваемый в утечке

Структура исходящего класса

Я новичок в этой кодовой базе. Из того, что я могу сказать, он использует PoolingHttpClientConnectionManager, который использует NioEndpoint для создания пула соединений. Использует FeignClient, который, в свою очередь, использует ApacheHttpClient, который устанавливается с помощью HttpClient с помощью диспетчера соединений. Я вижу, что потоки накапливаются, и я не могу сказать, почему. Любая помощь в этом очень ценится.

Ответ №1:

PoolingHttpClientConnectionManager (из Apache HttpComponents) не использует NioEndpoint (из Tomcat), который может использоваться только для входящих подключений (сокетов HTTP-сервера).

500 экземпляров SecureNioChannel , которые вы наблюдаете, представляют собой пул буферов для одновременного обслуживания до 500 соединений TLS. Это не утечка, а функция, которая уменьшает объем сборки мусора, необходимый для обслуживания запроса.

Вы можете управлять этим пулом с помощью нескольких параметров соединителя (см. документацию):

  • socket.bufferPool настраивает размер пула. Если вы установите это значение 0 , кэш не будет создан (но каждый запрос будет создавать новый SecureNioChannel объект),
  • socket.appReadBufSize и socket.appWriteBufSize настраивает размер каждого буфера. A SecureNioChannel использует два буфера каждого вида.