Нужна помощь в решении проблемы утечки потока - PullRequest
0 голосов
/ 18 июня 2019

Итак, мы создали новый сервер Netty4 и создаем нагрузку на него. Количество потоков хоста растет в зависимости от TPS для сервера. Более того, как только нагрузочное тестирование закончится, количество потоков в хосте не уменьшится (что свидетельствует о какой-либо утечке потока).

Я взял дамп hprof с помощью jstack и подключил его к JProfiler. В представлении потоков львиная доля потоков имеет формат. (Обратите внимание, что это дамп потока через несколько часов после нагрузочного теста, и один из его экземпляров, там тысячи застряли).

Дамп резьбы на 26013: 42,622,361

Thread group "main":

Thread "I/O dispatcher 18120":
at sun.nio.ch.EPollArrayWrapper.epollWait(long, int, long, int)
at sun.nio.ch.EPollArrayWrapper.poll(long) (line: 269)
at sun.nio.ch.EPollSelectorImpl.doSelect(long) (line: 93)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(long) (line: 86)
at sun.nio.ch.SelectorImpl.select(long) (line: 97)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute() (line: 255)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(org.apache.http.nio.reactor.IOEventDispatch) (line: 104) at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run() (line: 588 at java.lang.Thread.run() (line: 748)

Я не уверен, что делать дальше (например, я понятия не имею, на что должен ссылаться диспетчер ввода-вывода службы исполнителя).

Этот вопрос предназначен для общего руководства о том, как бороться с такими проблемами, как утечка потоков.

1 Ответ

0 голосов
/ 19 июня 2019

Получается, что диспетчер потоков ввода-вывода является частью HTTP-клиента Apache.

Мы должны были хранить кэш HTTP-клиентов Apache (чтобы быть более педантичными, клиенты с упругим поиском, поскольку они настроены для каждого запроса https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-configuration-samples.html). Каждый раз, когда мы видели новый запрос, полученный от клиента из этого кэша .

Теперь наш нагрузочный тест выдавал много запросов с разными учетными данными. Кэш продолжал увеличиваться и увеличиваться быстрее, чем клиенты истекли из кэша. Каждый клиент использовал все больше и больше потоков, пока мы не исчерпали их.

...