本文为博主原创,未经允许不得转载:

目录:

  1. 定位消耗cpu 的服务进程和线程

  2. 定位FGC 的原因

  3. 定位jvm 参数是否导致FGC

  4. 调试最优解的 jvm 配置

  

  描述:项目中存在一个后台服务,该后台服务主要用来执行定时任务与kafka 中间件消息的消费。在压测环境上部署时,观察到 cpu 的使用率 异常,竟然达到了 600%, 所以记录下该问题的定位和解决过程,以帮助更多的伙伴。

1. 定位消耗cpu 的服务进程和线程

  使用top 命令查看 服务器的cpu使用情况

top

  获取 top 中cpu 占用率最高的进程的pid ,通过 top -H -P pid 获取该进程对应所有线程的使用情况

top -H -p pid

  通过上面命令得到使用cpu 最高的线程号 threadId ,将线程号通过命令转换为十六进制:

 printf "%x\n" threadId

  通过以上命令获取到jvm中对应的 nid , 通过 jstack 查看该 threadId 线程的堆栈信息:

jstack -l pid| grep -10 nid

   通过以上命令判断该线程 执行任务的内容,从而推断导致cpu飙升的原因。

项目中碰到导致cpu飙升的原因是 存在较多的 FGC 线程,从而怀疑 是 项目内部不断FGC 导致CPU飙升,从而监控项目的FGC 频率

2. 定位FGC 的原因

  通过 jstat 命令查看 FGC 的频率。

jstat  -gc   pid  3000 

  发现 FGC 每隔三秒要进行9次左右的FGC垃圾回收。由于FGC 会导致STW (stop the world)现象,及服务不可用。

  需要定位 jvm 内存中的堆栈内容与线程。通过 Visualm 远程监控服务的jvm 性能,jvisualm 使用可参考这篇文章 (https://www.cnblogs.com/zjdxr-up/p/14916455.html),通过 jvisualm 查看服务当前存在的线程和堆内容。通过jvisualm 将堆内容与线程进行dump 之后,发现并未存在异常的内容。且 定时任务与kafka 都是开源的成熟框架,应该不会是导致频繁FGC 的主要原因。

  所以怀疑可能 服务的 jvm 参数配置存在问题,因为如果 jvm 参数设置不合理,当老年代的内存达到一定比例,则会进行FGC。下一步定位 jvm 的参数是否是主要原因。

3. 定位jvm 参数是否导致FGC

  由于我们的服务启动都会设置 最大堆内存和初始化堆内存等参数,所以需要调整 不同jvm 参数 时,服务内部的FGC 情况。

  以下为我们服务设置的 JVM 相关参数

-Xmn512m -Xms512m -Xmx2048m -XX:NewSize=512M -XX:MaxNewSize=512M -XX:-UseAdaptiveSizePlicy
-XX:ParallelGCThreads=16 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxTenuringThreshold=15

  为了形成做对比,采取 java -jar 的方式启动服务,不手动设置jvm相关配置,使用 JVM 默认的配置,进行观察是否有变化。

  通过 java -jar 方式启动,使用默认配置之后,再采用 top 观察cpu 使用 与 jstat 观察 FGC 频率,发现 cpu 的使用率降了下来,恢复了正常状态。

4. 调试最优解的 jvm 配置

  获取java -jar 服务启动的进程, 再使用 jinfo 命令 查看JVM 默认的配置,并修改以上jvm 的配置。我们服务器内存均为 32G,默认最大堆内存为 服务器内存的四分之一,即最大堆内存为 8G 。其余参数可根据最大堆内存进行推算出来,通常初始化内存与最大堆内存使用相同的配置。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。-Xmn 此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。年轻代大小 为 3G; 修改后的 jvm 配置参数如下:

-Xmn3072m -Xms8192m -Xmx8192m -XX:NewSize=3072M -XX:MaxNewSize=3072M -XX:-UseAdaptiveSizePlicy
-XX:ParallelGCThreads=16 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxTenuringThreshold=15

  补充:为了调试出相对比较好的jvm配置,将最大堆内存进行了多个配置对比,即从最大堆配置的值依次递增和递减 512M 之后,观察性能,发现默认配置依然最优解,所以才用默认配置作为服务启动的jvm配置

FGC频繁导致CPU 飙升定位及JVM配置优化总结的更多相关文章

  1. .dhpcd导致cpu飙升问题

    因公司有业务服务器在阿里云上面,阿里云后台报警说,“有恶意程序在挖矿”,引起了高度重视,于是我登陆服务器进行排查. 登陆云服务器:系统centos7.5 第一步使用top查看资源情况. top 可以清 ...

  2. OOM和JVM配置优化

    OOM这个缩写就是Java程序开发过程中让人最头痛的问题:Out of Memory.在很多开发人员的开发过程中,或多或少的都会遇到这类问题,这类问题定位比较困难,往往需要根据经验来判断可能出现问题的 ...

  3. 记录一次JVM配置优化的案例

    上周公司有一个应用,一到晚上高峰期的时候RT(响应时间)就很长.后来上服务器看了下JVM的配置,发现运维在启动参数那里把-Xss给设成了10M.导致每个线程占用的内存过大,导致内存消耗过快,其它线程排 ...

  4. CPU飙升排查

    怎么排查CPU飙升 线上有些系统,本来跑的好好的,突然有一天就会出现报警,CPU使用率飙升,然后重启之后就好了.例如,多线程操作一个线程不安全的list往往就会出现这种现象.那么怎么定位到具体的代码范 ...

  5. 正则表达式回溯-导致CPU偏高

    最近了解了下有关正则表达式回溯的内容,想想就写下来,方便自己. 正则表达式匹配算法是建立在正则表达式引擎的基础上的,目前有两种引擎:DFA(确定型有穷自动机)和NFA(不确定型有穷自动机).这两种引擎 ...

  6. 听说 JVM 性能优化很难?今天我小试了一把!

    文章首发于公众号「陈树义」及个人博客 shuyi.tech,欢迎关注访问. 对于 Java 开发的同学来说,JVM 性能优化可以说是比较难掌握的知识点.这不仅因为 JVM 性能优化需要掌握晦涩难懂的 ...

  7. 大量数据更新导致fgc频繁引起jvm服务暂停。

    线上跑的几台server突然出现大量fgc,因为在fgc过程的stop the world太久.引起其他应用訪问该server上的接口大量超时.(发生超时的时间点和fgc时间点一致) 先进行初步的优化 ...

  8. 一次FGC导致CPU飙高的排查过程

    今天测试团队反馈说,服务A的响应很慢,我在想,测试环境也会慢?于是我自己用postman请求了一下接口,真的很慢,竟然要2s左右,正常就50ms左右的. 于是去测试服务器看了一下,发现服务器负载很高, ...

  9. 性能分析(1)- Java 进程导致 CPU 使用率升高,问题怎么定位?

    性能分析小案例系列,可以通过下面链接查看哦 ps:这些分析小案例不能保证百分比正确,是博主学习过程中的总结,仅做参考 前提 本机有一个很占用 CPU 的项目,放在了 Tomcat 下启动着 如何定位 ...

  10. 线上CPU飙升100%问题排查,一篇足矣

    一.引子 对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考讨论提高. 二.问题复现 线上系统突然 ...

随机推荐

  1. python 图片相关

    python 图片相关 本篇介绍两种方式来打开图片. 1: 使用matplotlib #!/usr/bin/python3 # -*- coding: UTF-8 -*- ""&q ...

  2. ElasticSearch之Exists API

    检查指定名称的索引是否存在. 命令样例如下: curl -I "https://localhost:9200/testindex_002?pretty" --cacert $ES_ ...

  3. 浅谈树形DP

    树形DP是动态规划中最难也最常考的内容.具有DP和图论相结合的特点. 但从本质上来说,树形DP只不过是一种线性DP,只是将它与搜索结合起来了而已. 树形DP的基本步骤 读图 树形DP的题目中,通常会给 ...

  4. 如何延长window11更新信息?

    前言 日常使用电脑的时候,我们总是会遇到一个很常见的问题:如何关闭windows自动更新. 解决方法一: 暂停更新 解决方法二: 打开注册表: 运行 => regedit 进入: HKEY_LO ...

  5. POJ 3003 DP 寻路 记录路径

    POJ 3003 DP 寻路 记录路径 我一开始把M看成是每个a_i的上限了,这是致命的,因为这个题dfs暴力搜索+剪枝是过不了的因为M<=40,全部状态有2的四十次幂. 正解是DP,设dp[i ...

  6. Spring Boot3 系列:Spring Boot3 跨域配置 Cors

    目录 什么是CORS? Spring Boot 如何配置CORS? 前端代码 注解配置 全局配置 过滤器配置 注意事项 什么是CORS? CORS,全称是"跨源资源共享"(Cros ...

  7. 使用LiteOS Studio图形化查看LiteOS在STM32上运行的奥秘

    摘要:本文带来基于LiteOS一站式开发工具LiteOS Studio,通过单步调试,来动态分析LiteOS的启动流程. 编者按:在LiteOS大揭秘系列,我们和读者们分享了<LiteOS是怎么 ...

  8. iOS描述文件(.mobileprovision)一键申请

    转载:IOS描述文件制作教程 iOS描述文件(.mobileprovision)一键申请 在主界面上点击描述文件按钮. ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选)     新建ios ...

  9. 智定义、易调整,火山引擎DataLeap助力企业轻松实现全流程值班管理

     更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   近日,火山引擎大数据研发治理套件DataLeap全新上线值班管理模块,企业可通过该模块体系化智能化创建值班计 ...

  10. PPT 动画-多层旋转(圆角三角形)

    多层旋转动画 插入若干个三解形 然后将页面切换成[平滑](Office 2019~ 365 才有这功能,或者 iSlide 平滑过渡)