【问题标题】:Elasticsearch transport client spawning a large number of threadsElasticsearch 传输客户端产生大量线程
【发布时间】:2015-05-11 20:45:41
【问题描述】:

通过 Apache 风暴螺栓,我使用 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)

我在我的风暴拓扑中使用 ES 传输客户端的单个实例,它有大约 18 个输出流调用 ES 客户端以将数据写入 ES 集群。

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

【问题讨论】:

  • 1000 听起来很多。你能在这里粘贴更多信息吗,比如你的 Storm 配置,你用来启动 Storm 的命令行等等
  • 运行风暴拓扑的机器上有多少个 CPU 内核?
  • 您能否详细介绍一下 ES 传输客户端如何实例化到您的拓扑中?
  • 我们也在调查使用 Node 客户端时的大量线程。你的发现有什么更新吗?

标签: multithreading elasticsearch apache-storm


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以根据 org.elasticsearch.common.util.concurrent.EsExecutors 的源代码定义系统属性:“es.processors.override”或设置“processors”。我试过这个方法,成功限制worker线程数。

    /**
     * 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();
    

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 2016-09-28
      • 2017-01-02
      • 2017-08-31
      • 2016-11-21
      • 2016-01-22
      • 2014-11-22
      • 2015-09-13
      • 2021-11-27
      相关资源
      最近更新 更多