因此,我们创建了一个新的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 dispatcher应该引用什么executor服务)。
这个问题是关于如何解决像这样的线程泄漏问题的一般指导。
发布于 2019-06-19 12:12:43
因此,IO线程分派器是Apache HTTP客户端的一部分。
我们必须保留apache http客户端的缓存(更有学问的是,aws弹性搜索客户端,因为它们是按请求凭证https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-configuration-samples.html设置的)。任何时候我们看到从这个缓存中的客户端获取的新请求。
现在我们的负载测试抛出了许多具有不同凭据的请求。缓存不断变得越来越大,比客户端从缓存中过期的速度更快。每个客户端使用了越来越多的线程,直到我们耗尽它们。
https://stackoverflow.com/questions/56641529
复制相似问题