#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
настраивает размер каждого буфера. ASecureNioChannel
использует два буфера каждого вида.