背景介绍

某日下午大约四点多,接到合作方消息,线上环境,我这边维护的某http服务突然大量超时(对方超时时间设置为300ms),我迅速到鹰眼平台开启采样,发现该服务平均QPS到了120左右,平均RT在2秒多到3秒,部分毛刺高达5到6秒(正常时候在60ms左右)。

qps情况:

rt情况

问题解决

该服务是一个对内的运营平台服务(只部署了两台docker)预期qps个位数,近期没做过任何的线上发布,核心操作是整合查询数据库,一次请求最多涉及40次左右的DB查询,最终查询结果为一个多层树形结构,一个响应体大约50K。之前口头跟调用方约定要做缓存,现在看到QPS在120左右,(QPS证明没有做缓存),遂要求对方做缓存,降低QPS。后QPS降到80以内,rt恢复正常(平均60ms),最终QPS一直降到40(后续需要推动调用方上缓存,保证QPS在个位数)。

问题定位

由于该服务核心操作是查询数据库,且一次请求有40次DB query,遂首先排查是否慢sql导致,查看db性能监控,发现db 平均rt在0.3ms以内,可以算出来DB整体耗时在12ms左右,排除慢sql导致RT变高。

开始怀疑,是否DB连接池在高并发下出现排队,tddl默认的连接池大小是10.一查监控,整个占用的连接数从来没有超过7个,排除连接池不足的问题。

至此,造成RT高的原因,在数据库层面被排除。

接着开始查采样到的服务调用链上的每一个执行点,看看到底是调用链上的那部分耗时最多。发现里面很多执行点都有一个特点,就是本地调用耗时特别长(几百毫秒),但是真正的服务调用(比如db查询动作)时间却很短,(0ms代表执行时间小于1ms,也间接印证之前db的平均RT在0.3ms以内)

本地调用耗时: 267ms

客户端发送请求: 0ms

服务端处理请求: 0ms

客户端收到响应: 1ms

总耗时: 1ms

这时候问题逐渐清晰,问题出现在本地方法执行的耗时过长,可是再次检查该服务所有代码,并没有需要长耗时的本地执行逻辑,那么继续看CPU的load情况。

load长时间在4左右徘徊,我们的docker部署在4c8G的宿主机上,但是我们不能独占这个4C的,持续这么高的load已经不正常了。

继续追查cpu load飙高的原因,接着去看GC日志,发现大量的Allocation Failure,然后ParNew次数在每分钟100次以上,明显异常,见下GC日志例子

2020-03-25T16:16:18.390+0800: 1294233.934: [GC (Allocation Failure) 2020-03-25T16:16:18.391+0800: 1294233.935: [ParNew: 1770060K->25950K(1922432K), 0.0317141 secs] 2105763K->361653K(4019584K), 0.0323010 secs] [Times: user=0.12 sys=0.00, real=0.04 .........

java年轻代频繁gc_年轻代频繁ParNew GC,导致http服务rt飙高相关推荐

  1. 年轻代频繁ParNew GC,导致http服务rt飙高

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 北交吴志炜 来源 | https://www. ...

  2. java年轻代频繁gc_JVM 年轻代 老年代 持久代 gc

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  3. java 年轻代算法_java内存模型 年轻代/年老代 持久区,jvm中的年轻代 老年代 持久代 gc...

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  4. jvm中的年轻代 老年代 持久代 gc ----------转载

    jvm中的年轻代 老年代 持久代 gc 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation) ...

  5. GC 年轻代 老年代 持久代

    转载自:http://www.cnblogs.com/yaoyuan23/p/5587548.html 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Gener ...

  6. 内存管理_分代机制(年轻代、年老代、永久代)

    通用的分代垃圾回收机制 分代垃圾回收机制,是基于这样一个事实,不同的对象的生命周期是不一样的.因此,不同的生命周期的对象可以采用不同的回收算法,便以提高回收效率,我们将对象分为三种状态:年轻代.年老代 ...

  7. jvm中的年轻代 老年代 持久代 gc

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  8. JVM专题之分代模型:年轻代、老年代、永久代

    目录 一 什么是GC 分代 二 GC 为什么需要分代 三 GC 如何分代,每一个代具体是怎么工作的 3.1 年轻代 3.1.1 Eden Space 3.1.2 Survivor 3.2 老年代 3. ...

  9. 内存很空却频繁gc_记一次不太成功的频繁 full gc 排查过程

    上周自己负责的一个应用出现频繁full gc的问题,不得不尝试优化一下.第一次做这种事只能先看看网上的文章,然后亲自尝试怎么去完成减少full gc的频率,降低young gc的频率这一目标.虽然最终 ...

最新文章

  1. JDBC进阶:调用数据库,将文件或其他字节文件存入数据库,再从数据库取出写回硬盘
  2. html5 audio音频播放全解析
  3. php 文章列表,ThinkPHP初学者:主页,获取一个文章列表
  4. linux 显卡转码,ffmpeg用GPU转码
  5. 1-docker 介绍
  6. IP、ARP、RARP、ICMP、IGMP(网络协议:网络层协议)
  7. 机器学习中的数学(三)--牛顿法
  8. daily scrum 11.30
  9. spring+mybatis 事务管理,配置都正确,但是回滚不了
  10. 怎么直接播放或编辑WEBM格式的视频
  11. python解数独--世界最难数独2.3秒完成
  12. ASP入门教程 1小时ASP入门,非常简单
  13. Ps流转H264流 代码实现
  14. kafka中文文档new comsumer配置参数
  15. 中国染料产业竞争格局分析与消费需求调研报告2022版
  16. vue-cli脚手架卡在 ‘98%’ after emitting CopyPlugin 报错,无法运行
  17. java判断硬盘为固态硬盘_怎么看电脑是不是固态硬盘|查询电脑硬盘是HDD还是SSD的方法-系统城...
  18. linux 不识别 svg,manjaro/archlinux用yaourt -Syu滚动升级后大量图标主题不能用svg图标不能识别...
  19. 「游戏开发」游戏服务器端开发的一些经验
  20. 单元测试:通过读取csv/xml数据并且结合使用allure展示测试报告,验证开发中的add()和reduct()操作(在@allure.story分别实现相加减)

热门文章

  1. 95-180-055-源码-Watermark-AutoMaticWatermarkContext
  2. mysql 什么时候用单列索引?什么使用用联合索引?
  3. 详解SpringCloud中RabbitMQ消息队列原理及配置,一篇就够!
  4. Java多线程基础学习一:线程的6种状态和相互转化
  5. Java 中的异常处理
  6. C#回车切换焦点实现实例解析
  7. django模型查询
  8. Codeforces Round #191 (Div. 2) A. Flipping Game【*枚举/DP/每次操作可将区间[i,j](1=i=j=n)内牌的状态翻转(即0变1,1变0),求一...
  9. Ubuntu 16.04 Steam
  10. HttpRequest Get和Post调用其他页面的方法