elasticsearch,apache-storm,Multithreading,elasticsearch,Apache Storm" /> elasticsearch,apache-storm,Multithreading,elasticsearch,Apache Storm" />

Multithreading Elasticsearch传输客户端生成大量线程

Multithreading Elasticsearch传输客户端生成大量线程,multithreading,elasticsearch,apache-storm,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 [0x00007f7e96

在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 transport client的一个实例,它有大约18个输出流调用ES客户端将数据写入ES集群


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

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


您需要检查的是,每个工作进程是否只有一个传输客户端。在我之前的日子里,当我使用32个传输客户端时,有1000多个线程,在我将其正确修改为singleton实例后,线程数量减少到不到200个,包括在我的拓扑中创建的所有其他线程

您可以定义系统属性:es.processors.override或设置处理器,基于org.elasticsearch.common.util.concurrent.EsExecutors的源代码。我尝试了这个方法并成功地限制了工作线程的数量

/**
 * Settings key to manually set the number of available processors.
 * This is used to adjust thread pools sizes etc. per node.
 */
public static final String PROCESSORS = "processors";

/** Useful for testing */
public static final String DEFAULT_SYSPROP = "es.processors.override";
也来自


1000听起来像很多。你能在这里粘贴更多信息吗,比如你的Storm配置,你用来启动Storm的命令行,在运行storm topology的机器上,您有多少CPU内核?您能给我们更多关于ES传输客户端如何实例化到您的拓扑中的详细信息吗?我们也在研究使用节点客户端时的大量线程。关于你的发现有什么最新情况吗?
Settings settings = ImmutableSettings.settingsBuilder()
                    .put("transport.netty.workerCount",NUM_THREADS)
                    .build();