从Apache风暴中,我使用Elasticsearch的传输客户端远程连接到ES群集。当我获取风暴过程的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)
我在我的风暴拓扑中使用单个ES传输客户端实例,该拓扑有大约18个输出流调用ES客户端将数据写入ES群集。
为什么ES传输客户端会产生这么多线程?有什么方法可以调整这个吗?我尝试查找ES文档,但它没有提供有关传输客户端的线程机制的任何内部详细信息,也没有提供调整客户端线程数的选项。
答案 0 :(得分:0)
之前我的经历非常相似。正如您所提到的,一个传输客户端会创建数十个线程,包括计时器等。
您需要检查的是每个工作进程是否只有一个传输客户端。回到我早期,当我使用32个传输客户端时,有超过1千个线程,在我正确地将其修改为单例实例之后,线程数减少到不到2百(包括我创建的所有其他线程)拓扑)
答案 1 :(得分:0)
您可以根据org.elasticsearch.common.util.concurrent.EsExecutors的源代码定义系统属性:“es.processors.override”或设置“processors”。我尝试了这种方法并成功限制了工作线程的数量。
/**
* 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";
同样来自limit number of thread in ThreadPool while creating TransportClient in elasticsearch
Settings settings = ImmutableSettings.settingsBuilder()
.put("transport.netty.workerCount",NUM_THREADS)
.build();