Elasticsearch写入瓶颈导致skywalking大盘空白

 更新时间:2022年02月28日 14:34:45   作者:kl  
这篇文章主要为大家介绍了Elasticsearch写入瓶颈导致skywalking大盘空白的解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

前言

继上次skywalking出故障《解析Arthas协助排查线上skywalking不可用问题》不到一个月,线上skywalking又出毛病了。又是大盘空白,trace列表最近的数据都查询不出来,但是时间稍久的数据就能查询出来,如一天前的数据有,一个小时前的数据就没有,这个只是表象,最终查明症结是ES的服务写入瓶颈,导致写入写入数据的线程阻塞导致的。下面是排错过程以及解决方案说明。

问题定位

工具还是那个工具Arthas,不了解的可以翻阅我之前的博文,这里不多说明Arthas。不过这次我们应用了一个新的进阶指令thread,它可以查看当前线程信息,查看线程的堆栈。当skywalking大盘没有数据时,使用如下指令:

thread -b

THREAD -B, 找出当前阻塞其他线程的线程

有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。 为了排查这类问题, arthas提供了thread -b, 一键找出那个罪魁祸首。最后得到如下的结果:

如上图,相信大家已经看到问题所在了,重点在红色字体箭头指向的部分,不得不说Arthas做的太棒了。症结就是ES的批量写入失败线程阻塞了。后从社区了解到是因为ES写入瓶颈,导致skywalking在批量写入索引的时候线程阻塞了。导致阻塞的那段时间的数据都没有写到ES,然后查询是没有问题的,表象就是skywalking的大盘空白也查询不到近期的数据了。

解决方案

临时方案,SKYWALKING参数调优

skywalking写入ES的操作是使用了ES的批量写入接口。我们可以调整这些批量的维度。尽量降低ES索引的写入频率,如:

elasticsearch:
    clusterNodes: 192.168.20.221:9200 indexShardsNumber: 2 indexReplicasNumber: 0 # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html bulkActions: 4000 # Execute the bulk every 2000 requests bulkSize: 40 # flush the bulk every 20mb flushInterval: 30 # flush the bulk every 10 seconds whatever the number of requests concurrentRequests: 2 # the number of concurrent requests receiver-register: default:
receiver-trace: default:
    bufferPath: ../trace-buffer/ # Path to trace buffer files, suggest to use absolute path bufferOffsetMaxFileSize: 500 # Unit is MB bufferDataMaxFileSize: 1000 # Unit is MB bufferFileCleanWhenRestart: false

调整bulkActions默认2000次请求批量写入一次改到4000次。批量刷新从20M一次到40M一次。这种配置调优确实生效了,重启服务后两三天了都没有出现过ES写入阻塞的问题。不过这种设置只是暂时的,你只能期望流量不突发,或者应用不增加。一旦遇到突发流量和应用的增加,ES写入瓶颈还是会凸显出来。而且参数设置过大带来了一个新的问题,就是数据写入延时会比较大,一次服务交互发生的trace隔好久才能在skywalking页面上查询到。所以最终解决方案是优化ES的写入性能。

最终方案-优化ES的写入性能

如果是自建Elasticsearch服务,在基础大数据团队负责搜索引擎 Elasticsearch 优化和开发,博文里分享了很多可调优配置的参数。不过我们这边综合运维人力和支出方面的考虑,决定采用阿里云提供的Elasticsearch,不过这带来了一个新的问题,阿里云的ES服务不论内外网都需要Http Basic认证,但是目前的skywalking并没有提供这种支持。

结语

skywalking是一款非常不错的开源apm产品,很多功能特性甚至可以和商业的apm产品一争高下,比如trace查询等功能。我们线上的skywalking没有全面铺开去接入应用,但是问题还是发生了不少,希望这些线上的踩坑排坑经验能带来更多的参考价值。关于Elasticsearch 带Http Basic 认证skywalking不支持的问题,将在下文详描述去解决 

以上就是Elasticsearch写入瓶颈导致skywalking大盘空白的详细内容,更多关于Elasticsearch写入skywalking空白的资料请关注脚本之家其它相关文章!

相关文章

  • java打包成可执行的jar或者exe的详细步骤

    java打包成可执行的jar或者exe的详细步骤

    Java程序完成以后,对于Windows操作系统,习惯总是想双击某个exe文件就可以直接运行程序,现我将一步一步的实现该过程.最终结果是:不用安装JRE环境,不用安装数据库,直接双击一个exe文件,就可以运行程序
    2014-04-04
  • java编程实现获取服务器IP地址及MAC地址的方法

    java编程实现获取服务器IP地址及MAC地址的方法

    这篇文章主要介绍了java编程实现获取机器IP地址及MAC地址的方法,实例分析了Java分别针对单网卡及多网卡的情况下获取服务器IP地址与MAC地址的相关技巧,需要的朋友可以参考下
    2015-11-11
  • Java中递归构建树形结构的算法解读

    Java中递归构建树形结构的算法解读

    该文章介绍了如何使用Java递归算法构建树形结构,通过定义树节点类,遍历扁平数据列表,将节点加入对应父节点的子节点列表中,实现从扁平数据到树形结构的转换
    2025-03-03
  • JAVA 时间区间的字符串合法性验证

    JAVA 时间区间的字符串合法性验证

    需要对获得的诸如08:30-11:00这样的字符串进行合法性验证,判定表示的时间区间是否合法,以及对高峰期时间的区间是否在总的时间区间内部进行判断。
    2013-03-03
  • maven打包web项目时同时打包为war和jar文件的方法

    maven打包web项目时同时打包为war和jar文件的方法

    本篇文章主要介绍了maven打包web项目时同时打包为war和jar文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • java递归菜单树转换成pojo对象

    java递归菜单树转换成pojo对象

    这篇文章介绍了java递归菜单树转换成pojo对象的具体实现,有需要的朋友可以参考一下
    2013-08-08
  • 基于Java的Socket编写的C/S聊天程序实现

    基于Java的Socket编写的C/S聊天程序实现

    这篇文章主要介绍了基于Java的Socket编写的C/S聊天程序实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • spring boot拦截器的使用场景示例详解

    spring boot拦截器的使用场景示例详解

    这篇文章主要给大家介绍了关于spring boot拦截器的使用场景,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • java结合prometheus如何实现自定义数据监控

    java结合prometheus如何实现自定义数据监控

    文章介绍了如何配置Prometheus监控系统,包括配置文件prometheus.yml、被监控应用的指标暴露配置以及自定义监控指标的实现,同时,还详细说明了监控应用如何通过Prometheus API获取数据、处理数据并返回结果
    2024-12-12
  • spring使用RedisTemplate操作Redis数据库

    spring使用RedisTemplate操作Redis数据库

    这篇文章主要介绍了spring使用RedisTemplate操作Redis数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论