skywalking之elasticsearchcpu高

    xiaoxiao2022-07-04  162

    最近apm项目比较火,作为Apache的顶级项目之一的skywalking线上搭建部署.里面用到了elasticsearch作为存储引擎,作为JAVAEE的我其实对elasticsearch不是很熟,就当睬坑了吧,然后将事情的经过记录下来,希望能帮助到遇到问题的你,当然有问题也可以线下沟通,或者留言.

     

    ES线上集群环境,运行一段时间之后就出现cpu100%的情况. 

    如图:

    此机器cpu是4核,memory 8G

    通过性能分析发现是平均每秒发生一次ygc,修改jvm的gc策略后无果.

    只能先通过升级配置,

    cpu 4核—>8核

    memory 8G—>16G

     

    后续修改,jvm配置如下:

    运行几个小时之后发现cpu又变高了.然后google,修改elasticsearch.yml

    index.merge.scheduler.max_thread_count: 1 # 索引 merge 最大线程数

    indices.memory.index_buffer_size: 30%     # 内存

    index.translog.durability: async # 这个可以异步写硬盘,增大写的速度

    index.translog.sync_interval: 120s #translog 间隔时间

    discovery.zen.ping_timeout: 120s # 心跳超时时间

    discovery.zen.fd.ping_interval: 120s     # 节点检测时间

    discovery.zen.fd.ping_timeout: 120s     #ping 超时时间

    discovery.zen.fd.ping_retries: 6     # 心跳重试次数

    thread_pool.bulk.size: 20 # 写入线程个数 由于我们查询线程都是在代码里设定好的,我这里只调节了写入的线程数

    thread_pool.bulk.queue_size: 1000 # 写入线程队列大小

    index.refresh_interval: 300s #index 刷新间隔

     

    重启之后发现elasticsearch6.5不支持对index级别的设置,给出提示使用

    curl -XPUT  -H "Content-Type:application/json" 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{

      "index.merge.scheduler.max_thread_count" : "1",

      "index.refresh_interval" : "30s",

      "index.translog.durability" : "async",

      "index.translog.sync_interval" : "120s"

    }'

    然后修改对应localhost执行提示:

    Can't update non dynamic settings

    然后继续google,

    https://stackoverflow.com/questions/19758335/error-when-trying-to-update-the-settings

    显示需要先close索引,然后再执行,最后成功之后再打开

    curl -XPOST 'http://localhost:9200/_all/_close'

     

    curl -XPUT  -H "Content-Type:application/json" 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{

      "index.merge.scheduler.max_thread_count" : "1",

      "index.refresh_interval" : "30s",

      "index.translog.durability" : "async",

      "index.translog.sync_interval" : "120s"

    }'

    curl -XPOST 'http://localhost:9200/_all/_open'

    运行几个小时继续截图

    settings.index.merge.scheduler.max_thread_count

    合并调度程序(ConcurrentMergeScheduler)在需要时控制合并操作的执行(根据合并策略)。

    default:

        Math.max(1, Math.min(3, Runtime.getRuntime().availableProcessors() / 2))

    index refresh_interval: 设置成30s

        因为刷新很昂贵,所以提高索引吞吐量的一种方法是增加refresh_interval。较少刷新意味着负载较少,并且可以将更多资源转移到索引线程。

     

     

     

    持续关注cpu问题

     

     

     

     

     

     

     

     

    最新回复(0)