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

作者:kl 时间:2021-07-07 00:39:42 

前言

继上次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并没有提供这种支持。

来源:http://www.kailing.pub/article/index/arcid/235.html

标签:Elasticsearch,skywalking,写入空白
0
投稿

猜你喜欢

  • Java+Nginx实现POP、IMAP、SMTP邮箱代理服务

    2023-11-26 10:31:47
  • Java中的Unsafe在安全领域的使用总结和复现(实例详解)

    2023-07-30 10:58:42
  • java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例

    2021-06-21 12:29:50
  • 使用Java读取Word文件的简单例子分享

    2022-12-17 02:15:19
  • springboot 正确的在异步线程中使用request的示例代码

    2023-11-24 22:36:13
  • Java使用sftp定时下载文件的示例代码

    2022-11-14 06:11:47
  • java 键盘输入一个数,输出数组中指定元素的示例

    2023-11-24 20:31:14
  • JavaWeb登录界面登录失败在同一页面进行提示的解决

    2023-11-26 15:51:34
  • Kotlin基础教程之数据类型

    2023-12-06 15:23:22
  • 为什么不要使用 async void的原因分析

    2023-11-24 21:10:27
  • 新手学习微服务SpringCloud项目架构搭建方法

    2022-01-29 04:00:17
  • Spring自动注入失败的解决方法

    2022-08-13 03:41:31
  • spring与disruptor集成的简单示例

    2021-12-16 11:01:41
  • 分析ABA问题的本质及其解决办法

    2021-12-20 13:59:26
  • 基于Apache组件分析对象池原理的实现案例分析

    2023-11-05 16:55:57
  • C语言实现两个矩阵相乘

    2023-07-22 12:41:20
  • 测试springboot项目出现Test Ignored的解决

    2022-06-25 08:37:02
  • Java命名规范

    2022-10-03 00:06:59
  • C#中文随机数实现方法

    2023-12-07 20:56:30
  • IDEA中Mybatis的MGB使用逆向工程配置的详细教程

    2022-01-04 17:19:50
  • asp之家 软件编程 m.aspxhome.com