背景

Elasticsearch CPU很高的场景很常见,优化读写以及扩容即可解决问题。

如果只有一个节点CPU高,那可能的情况就比较多了,节点机器异常?读写不均匀?GC过高?forcemerge?

这里描述一个极具迷惑性的case。

问题

收到用户报障碍,突然有写入被reject,并且有一个节点的CPU突然增高。

分析、验证与结论

1.常用套路,先大致了解集群、索引。

集群层面:6.8.5 版本,18个节点(冷热分离)

索引层面:近3000个索引,大多数小索引(mb、1~10gb级别),template(设置1主分片、1副本分片)

用户行为:写多读少的OLAP场景

2.检查节点(pod)监控、宿主机监控、ES集群监控。没有很明显的异常行为。只能观测到异常节点CPU高、出现reject。用户的读写流量也没有观测到明显变化。

3.集群GC、merge等行为都很正常,并且只有一个节点CPU高(刚好用户索引都是1主1副),开始认为和热点相关。可能是某个索引的读写导致了节点CPU的上升。

4.使用 GET _nodes/hot_threads 查看CPU使用情况,果然抓到了异常节点占用CPU的主要是 write 线程。

5.由于hot_threads只能抓取瞬时的数据,不一定准确。准备进入容器,使用arthas工具抓取perf信息(arthas是阿里的开源工具、已经被我们集成到ES镜像里)。

通过arthas简要的获取热点线程:可以看到主要是write线程在执行bulk请求,然后还有日志打印的堆栈。

继续抓取2min内的统计信息:可以看到主要是search在使用CPU。和之前获取的信息不符。

6.分析到底是读还是写影响的CPU。

a.如果是写热点导致,应该会有2个节点CPU高;

b.写入一般很难长时间打高CPU,而一个拉全量/大量数据的大请求很可能拉高CPU,由于index设置1主1副本,刚好可以解释只有一个节点CPU高;

c.考虑到抓取的数据perf结果,2min内的抓取结果比瞬时的可信;

综合来看,大查询导致的CPU高的概率很大。

7.继续走排障流程,查看日志信息

看到异常节点日志里大多都是这类异常。

elasticsearch org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to stream /usr/share/elasticsearch/logs/e100024741.log org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to stream....

由于节点已经跑了很长时间,log盘写满也是有可能的,而且不太可能瞬间拉高CPU,暂时忽略。

8.进一步验证,将异常节点重启。

果然异常节点CPU下去了,另一个节点CPU起来了,进一步证明了是查询导致的,1主1副的case下,一个节点挂了,另一个承载流量。

继续观察异常节点的流量:outgoing的流量比较高,又进一步佐证了是查询带来的异常。

继续查看IO,write/read都相对比较高。

9.考虑到查询无法被阻断、且该节点异常带来的影响并不大,准备等“拉数据的大请求”执行完毕自动恢复。

10.开始关注其他问题。等待一段时间,发现依然没有恢复,且CPU完全没有下降的趋势。考虑到一个大请求不会执行这么长时间,如果多个大请求,至少reject、cpu曲线会有些波动,不会如此稳定。准备继续排查。再次执行多次hot_thread API,依然有很多次都只抓到了write线程占用大量CPU,如果大请求存在,不会一直抓不到search请求。

11.考虑其他思路。找到重启前异常节点和重启异常节点后才异常的节点共有的index(互为主备),在众多index中发现了一个较大的index(800G)。看了下文档数:2147483519,至此,找到了问题的答案。

12.结论:使用了同一template的大量索引(1 primary 1 replica),存在一个index写了大量doc数,超过了lucene的最大限制(integer的最大值),疯狂报错reject,并且记录大量异常日志,日志不断的rotate、清理造成了CPU的大幅上升。

仔细检查异常开始时间节点的日志,可以发现如下异常信息:

[2022-07-22T12:00:36,376][DEBUG][o.e.a.b.TransportShardBulkAction] [e100024741-es-default-1][cp0006014_2022_07][0] failed to execute bulk item (index) index {[cp0006014_2022_07][event_cp][Ir_HJYIBi3-VIQ2V8GIT], source[{"rowkey":"fff5e48f-13d9-4f68-b9c9-8cfc1f0fefa3","column01":"BatchValidateRecevieCouponRealTime","column02":"1","column03":"289358095","column04":"100009826","column05":"nkryj","column06":"32001052810269459246","column08":"fff5e48f-13d9-4f68-b9c9-8cfc1f0fefa3","column09":"[34m~L[34m~A34m~O~Q34m~H[34m~D34m| "column11":"2022-07-22 20:00:29.703","column12":"1","column20":"0","datachangelasttime":1658491229707,"rules":[],"rulesh":[],"scenes":[]}]}
java.lang.IllegalArgumentException: number of documents in the index cannot exceed 2147483519at org.apache.lucene.index.DocumentsWriterPerThread.reserveOneDoc(DocumentsWriterPerThread.java:226) ~[lucene-core-7.7.2.jar:7.7.2 d4c30fc2856154f2c1fefc589eb7cd070a415b94 - janhoy - 2019-05-28 23:30:25]at org.apache.lucene.index.DocumentsWriterPerThread.updateDocument(DocumentsWriterPerThread.java:235) ~[lucene-core-7.7.2.jar:7.7.2 d4c30fc2856154f2c1fefc589eb7cd070a415b94 - janhoy - 2019-05-28 23:30:25]at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:494) ~[lucene-core-7.7.2.jar:7.7.2 d4c30fc2856154f2c1fefc589eb7cd070a415b94 - janhoy - 2019-05-28 23:30:25]at org.apache.lucene.index.IndexWriter.updateDocument(IndexWriter.java:1616) ~[lucene-core-7.7.2.jar:7.7.2 d4c30fc2856154f2c1fefc589eb7cd070a415b94 - janhoy - 2019-05-28 23:30:25]at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1235) ~[lucene-core-7.7.2.jar:7.7.2 d4c30fc2856154f2c1fefc589eb7cd070a415b94 - janhoy - 2019-05-28 23:30:25]at org.elasticsearch.index.engine.InternalEngine.addDocs(InternalEngine.java:1175) ~[elasticsearch-6.8.5.jar:6.8.5]at org.elasticsearch.index.engine.InternalEngine.indexIntoLucene(InternalEngine.java:1120) ~[elasticsearch-6.8.5.jar:6.8.5]

进一步验证:进入容器清理日志文件,会立刻生成并rotate出多个日志文件。

最终处理:清理掉异常索引立刻恢复正常:

解释前面的坑

1.arthas采集2min内的CPU信息,得到的search结论是正确的,该集群确实存在search大请求。虽然频率不高,但是采集到的概率很大。

2.异常节点的out流量很大。这个逻辑也是正确的,只是并不是导致异常的根本原因。

确实有拉数据的请求存在;节点存在大量索引的分片,无法确认流量来源是否是其他index;该异常情况下用户收到异常ack之后会有重试,影响到流量的统计。

3.重启后另一个节点CPU就开始激增,是因为副本分片成为了主分片,然后开始reject,并疯狂打印日志、进行rotate和清理。

4.为什么只有一个节点CPU高。写入流程是主分片写入成功后,异步转发请求给所有副本(此处只有1),由于主分片写入失败,直接异常,副本也就不会受到影响。

思考

1.经验流大多情况有效,有时却不可取。时刻根据事实排障,避免先入为主。

2.相似的现象以及采集排障数据的巧合进入思维误区,集群业务复杂度增加了排障难度:

大量的日志难以查找(被AppenderLoggingException淹没),且都被判定为和本次异常无关,如 bulk reject 被认为是CPU高的场景下正常的表现,AppenderLoggingException 被认为无法快速消耗CPU,number of documents in the index cannot exceed 2147483519 刚看到时也被认为无法导致CPU增高(仅仅是无法写入);

index太多,无法从单个index层面获取更多信息。(没有明确目标的情况下难以发现那一个异常index)。

3.arthas write线程的堆栈信息中有体现,bulk之后就在打印日志,这两点之间的关联被忽略。

4.优化方向:需要更细粒度的监控和巡检能力,快速发现异常index可大大加快排障进程,不再强依赖OPS的知识体系与推理。

一个迷惑性很高的生产故障-Elasticsearch日志rotate导致节点CPU激增相关推荐

  1. 如何开发及维护一个可运营性很高的电商系统

    1.  一定要逐步考虑安排分库分表 (1)  用户表.商品表.订单表等基本表必须要考虑分库分表,要不未来随着量大很容易出现异常. (2)  首页.列表页等聚合页面,通过数据冗余,在分库分表后多写一份, ...

  2. oracle磁盘使用率很高,oracle安装磁盘使用率100%导致数据插入等操作报错

    环境: ORACLE安装目录:   C盘(50G  使用率100%) 表空间DBF文件目录:E盘(100G 使用率20%) 问题: C盘100%后,清理了几次磁盘,但是导入历史数据(量较大)仍然插入数 ...

  3. 转载一份大佬的面试指南,命中率很高

    说在最前面的话 这是一个份转载的面试锦囊,好的东西要分享,嘿嘿嘿 为了防止大佬删除自己没得地方看了,所以就转载了,大佬说过有些地方可能有些不妥,大家自行参照,哪怕不面试,当作知识积累也好啊,啊哈哈哈哈 ...

  4. linux分区压力测试,stress-Linux系统压力测试工具使用及系统负载很高的几种场景测试...

    安装 yum install stress stress-ng -y stess-ng是stress的下一代,功能更加完善 常用选项 -c,--cpu:代表进程个数(每个进程会占用一个cpu,当超出c ...

  5. 训练集准确率很高,验证集准确率低问题

    训练集在训练过程中,loss稳步下降,准确率上升,最后能达到97% 验证集准确率没有升高,一直维持在50%左右(二分类问题,随机概率) 测试集准确率57% 在网上搜索可能打的原因: 1.learnin ...

  6. 长城皮卡品牌CEO张昊保:皮卡是一个独特的品类,想玩门槛很高

    「皮卡车型是一个很独特的品类,高端的很高端,低端的很低端,并且还有使用的法规限制,所以我们的产品计划一定是有别于普通乘用车的.」 这是长城汽车皮卡品牌 CEO.中汽协皮卡分会理事长张昊保,在上海车展期 ...

  7. R语言计算回归模型每个样本(观察、observation、sample)的杠杆值(leverage)实战:如果一个样本的预测变量比其他样本的预测变量值更极端,那么被认为具有很高的杠杆作用

    R语言计算回归模型每个样本(观察.observation.sample)的杠杆值(leverage)实战:如果一个样本的预测变量比其他样本的预测变量值更极端,那么被认为具有很高的杠杆作用 目录

  8. 升级鸿蒙系统好不好用,昨天随手发了一个有关升级鸿蒙系统后的使用体会,没料到引发这么大的讨论。看来大家对这个话题关注度很高。作为一个普通消费者,... - 雪球...

    来源:雪球App,作者: 新山野,(https://xueqiu.com/1343651531/181846205) 昨天随手发了一个有关升级鸿蒙系统后的使用体会,没料到引发这么大的讨论.看来大家对这 ...

  9. nunito字体_dcat-admin: 使用很少的代码快速构建一个功能完善的高颜值后台系统,内置丰富的后台常用组件,开箱即用,让开发者告别冗杂的HTML代码。...

    Dcat Admin是一个基于laravel-admin二次开发而成的后台系统构建工具,只需很少的代码即可快速构建出一个功能完善的高颜值后台系统.内置丰富的后台常用组件,开箱即用,让开发者告别冗杂的H ...

最新文章

  1. java链式编程_Java 中的链式编程
  2. python实现快排算法(quicksort)
  3. 第九周项目二-我的数组类
  4. webpack预览页面配置
  5. java 实例变量初始化_java学习之实例变量初始化
  6. android自定义view圆,Android自定义View圆形百分比控件(一)
  7. ORACLE----触发器,存储过程及JOB
  8. [LeetCode] Permutations 解题报告
  9. 美国硅谷预测10年后的世界,再不懂你就落伍了
  10. 循环自相关函数和谱相关密度(三)——实信号、复信号模型下的BPSK信号循环谱MATLAB仿真结果及代码
  11. python 循环加速_CPU靠边站!使用cuDF在GPU加速Pandas
  12. 同域下iframe父页面和子页面调用
  13. Java的8种基本数据类型
  14. linux摄像头内核驱动开发,Linux系统下USB摄像头驱动开发
  15. python手机价格预测论文_基于Python的微博发表意向预测研究
  16. HTCVIVE无线套装安装后unityvr项目无法在头盔中显示
  17. 推荐收藏 | 100个数据分析常用指标和术语
  18. 查看已安装Tomcat的版本号
  19. 4-佛教入华及其早期传播
  20. 《了不起的盖茨比》中体现的人生观、价值观、爱情观

热门文章

  1. librosa能量_librosa中mfcc函数的一点小问题
  2. 操作系统: 司机与售票员的进程同步问题
  3. Numpy数据类型转换astype,dtype
  4. 利用python爬虫爬取豆瓣读书-文学-名著的封面
  5. Java-线程池 ThreadPool 专题详解 (美团面试题)
  6. win 8 store app 免费中通快递查询 隐私声明
  7. SQL级联删除与级联更新使用格式
  8. linux命令hwclock,Linux命令篇之hwclock命令和man命令(示例代码)
  9. mxp组件开发及jsfl文件
  10. 【小坤哥】杂谈 - 梦想总是要有的,万一实现了呢