前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch集群写入性能突然衰减问题定位与解决

Elasticsearch集群写入性能突然衰减问题定位与解决

原创
作者头像
bellen
发布2022-02-14 17:07:16
1.1K0
发布2022-02-14 17:07:16
举报

背景

线上的Elasticsearch集群在某一天早上开始写入吞吐下降,环比下降了30%,但是业务的数据量环比没有下降,从而导致数据积压在Kafka中无法消费。

写入吞吐下降后,通过查看监控,发现cpu使用率和load也下降,并没有明显的异常能够表明是Elasticsearch集群出了问题,问题变得棘手起来了。

问题定位

通过查看jstack,可以看到有热点线程,大量线程栈顶为java时间解析类,并且主要有两种时间解析类栈顶:

结合上述时间解析类的堆栈,查看elasticsearch源码,发现在北京时间9月29日 08:00刚好是一个特殊的时间点,0时区的9月29日00:00, 会触发时间解析类的日期检查函数,判断29号是否一个合法的日期:

而这个代码里的if条件,实际上是会进行编译优化,通过抓取进程的火焰图,可以验证性能下降实际上与编译优化的Deoptimization有关,Deoptimization正常情况下占用cpu一般在0.1%,而下图中实际占用了19.92%,这就意味着出现编译退化导致解释执行,而Java的解释执行相比编译优化执行速度慢了两个数量级。

编译退化,实际上是触发了JDK的一个bug(https://bugs.openjdk.java.net/browse/JDK-8227523),在29日这个临界时间点附近,可能触发LocatDate::create()在带有和不带有日期检查(switch分支)的编译优化代码之间反复切换,当切换超过400次之后,就会触发编译退化到解释执行。Presto也有遇到过类似的问题:http://armsword.com/2019/09/18/solve-presto-system-load-too-high/。

此外,从写入的数据字段来看,每条数据会包含4个时间字段,会进一步加大进入到LocateDate::create()的概率,从而拉低写入性能。

解决方案

  1. 临时的解决方案:快速重启集群可以使得JIT编译优化进行到正确的优化分支,避免反复编译优化,触发JDK 的bug。
  2. 长期方案: 通过调整JVM参数,规避进入到编译退化分支的可能性:
代码语言:txt
复制
	-XX:PerMethodRecompilationCutoff=10000
	-XX:PerBytecodeRecompilationCutoff=10000
	-XX:ReservedCodeCacheSize=512M

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 问题定位
  • 解决方案
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档