multithreading - Elasticsearch Transport客户端产生大量线程

标签 multithreading elasticsearch apache-storm

通过Apache Storm bolt ,我正在使用Elasticsearch的传输客户端远程连接到ES集群。当我获取Storm进程的jstack输出时,我注意到有近1000个带有ES堆栈跟踪的线程,例如:

elasticsearch[Flying Tiger][transport_client_worker][T#22]{New I/O worker #269}" daemon prio=10 tid=0x00007f80ac3cb000 nid=0x356b runnable [0x00007f7e96b2a000]
   java.lang.Thread.State: RUNNABLE
    at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
    at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
    at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
    - locked <0x00000000d148d138> (a sun.nio.ch.Util$2)
    - locked <0x00000000d148d128> (a java.util.Collections$UnmodifiableSet)
    - locked <0x00000000d148c9b8> (a sun.nio.ch.EPollSelectorImpl)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
    at org.elasticsearch.common.netty.channel.socket.nio.SelectorUtil.select(SelectorUtil.java:68)
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioSelector.select(AbstractNioSelector.java:415)
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:212)
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)
    at org.elasticsearch.common.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
    at org.elasticsearch.common.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
    at org.elasticsearch.common.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

我正在整个 Storm 拓扑中使用ES传输客户端的单个实例,该实例具有大约18个输出流,这些输出流调用ES客户端将数据写入ES群集。

为什么ES传输客户端产生这么多线程?有什么办法可以调整吗?我尝试查找ES文档,但没有提供有关传输客户端线程机制的任何内部详细信息,也没有提供调整客户端线程数的选项。

最佳答案

我以前也有非常相似的经历。正如您已经提到的,一个传输客户端创建了数十个线程,包括计时器等。

您需要检查的是每个工作进程是否确实有一个传输客户端。早些时候,当我使用32个传输客户端时,有1000多个线程,并且在我将其正确修改为单例实例后,线程数减少到不到200(包括我创建的所有其他线程)拓扑)

关于multithreading - Elasticsearch Transport客户端产生大量线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30177336/

相关文章:

java - 如何找出 Storm 拓扑中哪个 bolt 没有确认?

java - Intellij IDEA Maven : can't resolve symbol "backtype"

multithreading - 类型错误 : req_con() takes 1 positional argument but 12 were given

rest - 触发河流更新elasticsearch

elasticsearch - 嵌套对象的术语向量不起作用

java - 在项目文件夹内创建的 Elasticsearch 中的数据目录

java - 在本地模式下运行多个storm拓扑

c++ 范围和 windows 线程线程

java - 客户端可以同时向多个服务器发送消息吗?

python - 将函数传递给多处理池中的 map 或星图