需要有关解决线程泄漏问题的帮助
Need help regarding attacking a thread leak issue
所以我们已经创建了一个新的 Netty4 服务器并正在为它生成负载。主机线程的数量随着服务器 TPS 的增加而增长。此外,一旦负载测试结束,主机线程数就不会下降(表明存在某种线程泄漏)。
我使用 jstack 进行了 hprof 转储并将其连接到 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)
我不确定如何从这里进一步进行(例如,我不知道应该引用哪个执行程序服务 IO 调度程序)。
这个问题是关于如何解决像这样的线程泄漏问题的一般指导。
原来 IO 线程调度程序是 Apache HTTP 客户端的一部分。
我们必须保留 apache http 客户端的缓存(更迂腐,aws elastic 搜索客户端,因为它们是根据请求凭据设置的 https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-configuration-samples.html)。每当我们看到一个新的请求时,我们就从这个缓存中从客户端获取。
现在我们的负载测试抛出许多具有不同凭据的请求。缓存变得越来越大,比客户端从缓存中过期的速度更快。每个客户端都使用了越来越多的线程,直到我们 运行 耗尽它们。
所以我们已经创建了一个新的 Netty4 服务器并正在为它生成负载。主机线程的数量随着服务器 TPS 的增加而增长。此外,一旦负载测试结束,主机线程数就不会下降(表明存在某种线程泄漏)。
我使用 jstack 进行了 hprof 转储并将其连接到 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)
我不确定如何从这里进一步进行(例如,我不知道应该引用哪个执行程序服务 IO 调度程序)。
这个问题是关于如何解决像这样的线程泄漏问题的一般指导。
原来 IO 线程调度程序是 Apache HTTP 客户端的一部分。
我们必须保留 apache http 客户端的缓存(更迂腐,aws elastic 搜索客户端,因为它们是根据请求凭据设置的 https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-configuration-samples.html)。每当我们看到一个新的请求时,我们就从这个缓存中从客户端获取。
现在我们的负载测试抛出许多具有不同凭据的请求。缓存变得越来越大,比客户端从缓存中过期的速度更快。每个客户端都使用了越来越多的线程,直到我们 运行 耗尽它们。