火眼金睛破局ES伪慢查询 | 京东物流技术团队

京东云开发者
• 阅读 267

一、问题现象

服务现象

服务接口的TP99性能降低

火眼金睛破局ES伪慢查询 | 京东物流技术团队

ES现象

  • YGC:耗时极其不正常, 峰值200+次,耗时7s+
  • FULL GC:不正常,次数为1但是频繁,STW 5s
  • 慢查询:存在慢查询5+

火眼金睛破局ES伪慢查询 | 京东物流技术团队

二 解决过程

1、去除干扰因素

  • 从现象上看应用是由于某种原因导致JVM内存使用率不断增长,触发了频繁的YGC进而触发FGC(此时只是大胆的猜测)。
  • 此时ES的JVM配置是JVM内存40G,使用CMS垃圾回收器。40G的内存使用CMS垃圾回收器性能显然不如G1更合适
  • 找ES运维同学垃圾回收器由CMS修改为G1

(tips:不是所有的ES都适合G1,针对很多大查询的G1的Full GC会导致GC模式退化为串行扫描整个堆,导致几十秒甚至是分钟级别的暂停。这种长时间的暂停不仅影响用户的查询,还容易造成节点间的通信超时,导致master、dataNode脱离集群,影响集群稳定性。)

修改为G1后的GC变化:

  • YGC:耗时极正常, 峰值35+次,耗时800ms
  • FULL GC:正常,次数为0
  • 慢查询:存在慢查询10+

火眼金睛破局ES伪慢查询 | 京东物流技术团队

2、查找问题

ES的JVM垃圾回收器调整后,杰夫接口的服务接口的性能并没有因为GC问题的解决而解决。

  • 通过和ES侧同学的沟通了解到,这个ES集群的refresh极其异常,refresh:2w+。

火眼金睛破局ES伪慢查询 | 京东物流技术团队

  • ES监控中的慢查询语句单独去执行并不慢

火眼金睛破局ES伪慢查询 | 京东物流技术团队

原因:

应用中和ES的交互使用的是3.1.9.RELEASE 版本的spring-data-elasticsearch的包,ES数据同步工作是通过该API的中的save方法进行保存数据的,如下图所示,该版本的save操作每次save后都会进行refresh操作

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.1.9.RELEASE</version>

火眼金睛破局ES伪慢查询 | 京东物流技术团队

为什么每次refresh会对查询产生影响呢,今天咱们也赶个时髦,让GPT给咱们回复下试试:

火眼金睛破局ES伪慢查询 | 京东物流技术团队

火眼金睛破局ES伪慢查询 | 京东物流技术团队

火眼金睛破局ES伪慢查询 | 京东物流技术团队

3、修复方案

  • 升级spring-data-elasticsearch 的版本到4.x以上,由于spring-data-elasticsearch高本版不兼容低版本改动成本较大,该项目中的所有涉及API操作的地方都需要改动

  • save操作改用operation进行操作(目前选择的该方案,改动较少)

火眼金睛破局ES伪慢查询 | 京东物流技术团队

慢查询已经消失

火眼金睛破局ES伪慢查询 | 京东物流技术团队

refresh的次数也降了下来

火眼金睛破局ES伪慢查询 | 京东物流技术团队

三、问题解决

最终的业务服务接口性能正常了。

教员常说我们总是被经验主意和投机主义左右我们的思想,破局这一问题的根本解决方式是只有实事求是,实践是真理的标准。

火眼金睛破局ES伪慢查询 | 京东物流技术团队

作者:京东物流 王义杰

来源:京东云开发者社区 自猿其说Tech 转载请注明来源

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
mysql配置调优
工作中,会遇到需要查看mysql的top20慢sql,逐个进行优化,加上必要的索引这种需求,这时就需要开启数据库的慢查询日志的功能1.查询当前慢查询日志的状态\默认为关闭状态mysqlshowvariableslike"
Stella981 Stella981
3年前
PostgreSQL死锁进程及慢查询处理
1、死锁进程查看:SELECTFROMpg_stat_activityWHEREdatname'数据库名称'andwaitingtrue;pid进程id。2、慢查询SQL:selectdatname,pid,usename,application_name,client_addr,client
Wesley13 Wesley13
3年前
Mysql 执行计划各列释义
在排查编写Mysql查询语句时,除了需要满足业务条件,还需要考虑所编写SQL的性能表现,避免出现慢SQL导致大量慢查询的情况。通常,可以通过查看执行计划的方式查看所编写SQL语句的性能优劣。此外,还可以通过查看语句的分阶段执行的时间、操作消耗来进行补充分析。1\.执行计划的列1.1.id列查询的序号1.2.s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
京东云开发者 京东云开发者
1星期前
提供方耗时正常,调用方毛刺频频
作者:京东零售王森一现象调用方AJSF提供方B大多数情况下,调用方耗时和提供方耗时基本没有差别个别情况下,调用方耗时远高于提供方耗时,大概5分钟20次1.调用方A耗时如下图2.提供方B耗时如下图3.调用方监控添加在调用JSF接口前后加的监控,没有其他任何
京东云开发者 京东云开发者
1星期前
提供方耗时正常,调用方毛刺频频
作者:京东零售王森一现象调用方AJSF提供方B大多数情况下,调用方耗时和提供方耗时基本没有差别个别情况下,调用方耗时远高于提供方耗时,大概5分钟20次1.调用方A耗时如下图2.提供方B耗时如下图3.调用方监控添加在调用JSF接口前后加的监控,没有其他任何
DeepFlow开源 DeepFlow开源
1年前
应用响应时延背后 深藏的网络时延
应用异常时,基本可以分为服务访问不通和服务响应慢两个大类。其中服务响应慢的问题定位非常棘手,很多无头案。应用团队有日志和追踪,对于自认为的不可能不合理的事情都会甩给基础设施团队,又由于基础设施团队现有的监控数据缺乏应用的观测视角,通常成为一切「不是我的问题」超自然现象的终极背锅侠,其中以网络团队尤为严重。
慢SQL原因分析之索引失效 | 京东物流技术团队
现象最近收到一个慢sql工单,慢sql大概是这样:“selectxxxfromtabelwheretype1”。咦,type字段明明有索引啊,为啥是慢sql呢?原因通过执行explain,发现实际上数据库执行了全表扫描,从而被系统判定为慢sql。这时有一定
记一次生产慢sql索引优化及思考 | 京东云技术团队
一问题重现夜黑风高的某一晚,突然收到一条运营后台数据库慢sql的报警,耗时竟然达到了60s。看了一下,还好不是很频繁,内心会更加从容排查问题,应该是特定条件下没有走到索引导致,如果频繁出现慢查询,可能会将数据库连接池打满,导致数据库不可用,从而导致应用不可