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

前言

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

问题定位

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

thread -b

thread -b, 找出当前阻塞其他线程的线程

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

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

如上图,相信大家已经看到问题所在了,重点在红色字体箭头指向的部分,不得不说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服务,可以参考这篇博文:https://www.easyice.cn/archives/207。这个博主在基础大数据团队负责搜索引擎 Elasticsearch 优化和开发,博文里分享了很多可调优配置的参数。不过我们这边综合运维人力和支出方面的考虑,决定采用阿里云提供的Elasticsearch,不过这带来了一个新的问题,阿里云的ES服务不论内外网都需要Http Basic认证,但是目前的skywalking并没有提供这种支持。

结语

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

作者简介:

陈凯玲,2016年5月加入凯京科技。曾任职高级研发和项目经理,现任凯京科技研发中心架构&运维部负责人。pmp项目管理认证,阿里云MVP。热爱开源,先后开源过多个热门项目。热爱分享技术点滴,独立博客KL博客(http://www.kailing.pub)博主。

关于架构&运维部

凯京研发中心架构&运维部的工作主要分两大部分,架构部分主要负责框架中间件的研究,如dubbo、apollo、skywalking、xxljob、分布式事务等、公司内开源项目(https://gitee.com/kekingcn)以及公共服务公共组件的研发维护、新技术的引进以及落地等。运维部分主要负责devops系统研发以及k8s容器环境的维护等工作。

架构组招聘

目前架构组还有两个虚位以待,欢迎志同道合的你来和我们一起交流。简历可发送至邮箱:chenkailing@keking.cn

上一篇:2019阿里云双12年末采购节主会场全攻略 | 12月5号云栖号夜读


下一篇:阿里主管通知我试用期延期…… | 12月24号云栖号夜读