如果线上服务器发生CPU占用率高时,应该如何排查并定位问题。

1、问题发现

本文整理自一个真实的案例,是楼主负责的业务,在一次大促之前的压测时发现了这个问题。

在每次大促之前,我们的测试人员都会对网站进行压力测试,这个时候会查看服务的cpu、内存、load、rt、qps等指标。

在一次压测过程中,测试人员发现我们的某一个接口,在qps上升到500以后,CPU使用率急剧升高。

CPU占用率,又称CPU使用率。顾名思义,CPU利用率是来描述CPU的使用情况的,表明了一段时间内CPU被占用的情况。使用率越高,说明你的机器在这个时间上运行了很多程序,反之较少。

2、问题定位

遇到这种问题,首先是登录到服务器,看一下具体情况。

定位进程

登录服务器,执行top命令,查看CPU占用情况:$top

PID USERPR  NI  VIRT  RES  SHR S %CPU %MEMTIME+  COMMAND

1893 admin     20   0 7127m 2.6g  38m S 181.7 32.6  10:20.26 java

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

通过以上命令,我们可以看到,进程ID为1893的Java进程的CPU占用率达到了181%,基本可以定位到是我们的Java应用导致整个服务器的CPU占用率飙升。

定位线程

我们知道,Java是单进程多线程的,那么,我们接下来看看PID=1893的这个Java进程中的各个线程的CPU使用情况,同样是用top命令:$top-Hp 1893

PID USERPR  NI  VIRT  RES  SHR S %CPU %MEMTIME+  COMMAND

4519 admin     20   0 7127m 2.6g  38m R 18.6 32.6   0:40.11 java

通过top -Hp 1893命令,我们可以发现,当前1893这个进程中,ID为4519的线程占用CPU最高。

定位代码

通过top命令,我们目前已经定位到导致CPU使用率较高的具体线程, 那么我么接下来就定位下到底是哪一行代码存在问题。

首先,我们需要把4519这个线程转成16进制:$printf %x 4519

11a7

接下来,通过jstack命令,查看栈信息:$sudo -u admin  jstack 1893 |grep -A 200 11a7

"HSFBizProcessor-DEFAULT-8-thread-5"#500 daemon prio=10 os_prio=0 tid=0x00007f632314a800 nid=0x11a2 runnable [0x000000005442a000]

java.lang.Thread.State: RUNNABLE

atsun.misc.URLClassPath$Loader.findResource(URLClassPath.java:684)

atsun.misc.URLClassPath.findResource(URLClassPath.java:188)

atjava.net.URLClassLoader$2.run(URLClassLoader.java:569)

atjava.net.URLClassLoader$2.run(URLClassLoader.java:567)

atjava.security.AccessController.doPrivileged(Native Method)

atjava.net.URLClassLoader.findResource(URLClassLoader.java:566)

atjava.lang.ClassLoader.getResource(ClassLoader.java:1093)

atjava.net.URLClassLoader.getResourceAsStream(URLClassLoader.java:232)

atorg.hibernate.validator.internal.xml.ValidationXmlParser.getInputStreamForPath(ValidationXmlParser.java:248)

atorg.hibernate.validator.internal.xml.ValidationXmlParser.getValidationConfig(ValidationXmlParser.java:191)

atorg.hibernate.validator.internal.xml.ValidationXmlParser.parseValidationXml(ValidationXmlParser.java:65)

atorg.hibernate.validator.internal.engine.ConfigurationImpl.parseValidationXml(ConfigurationImpl.java:287)

atorg.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:174)

atjavax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111)

atcom.test.common.util.BeanValidator.validate(BeanValidator.java:30)

通过以上代码,我们可以清楚的看到,BeanValidator.java的第30行是有可能存在问题的。

3、问题解决

接下来就是通过查看代码来解决问题了,我们发现,我们自定义了一个BeanValidator,封装了Hibernate的Validator,然后在validate方法中,通过Validation.buildDefaultValidatorFactory().getValidator()初始化一个Validator实例,通过分析发现这个实例化的过程比较耗时。

我们重构了一下代码,把Validator实例的初始化提到方法外,在类初始化的时候创建一次就解决了问题。

4、总结

以上,展示了一次比较完成的线上问题定位过程。主要用到的命令有:top 、printf 和 jstack

另外,线上问题排查还可以使用Alibaba开源的工具Arthas进行排查,以上问题,可以使用一下命令定位:thread -n 3 //查看cpu占比前三的线程

以上,本文介绍了如何排查线上服务器CPU占用率高的问题,如果大家感兴趣,后面可以再介绍一些关于LOAD飙高、频繁GC等问题的排查手段。

服务器cpu占用率高怎么解决,线上服务器CPU占用率高怎么办?相关推荐

  1. cpu飙升 死循环_java排查一个线上死循环cpu暴涨的过程分析

    问题,打一个页面cpu暴涨,打开一次就涨100%,一会系统就卡的不行了. 排查方法,因为是线上的linux,没有用jvm监控工具rim链接上去. 只好用命令排查: top cpu排序,一个java进程 ...

  2. 服务器主体信息截图,puppeteer实现线上服务器任意区域截图

    整个九月份由于业务繁重以及玩心颇重,一直没有机会来写一篇博文.而且笔者于十月一日将会举办人生大事--婚礼,现在家里筹办过程中只能抽出零碎的时间来写这篇文章. 关于服务端截图,这种使用场景非常少见,大多 ...

  3. window服务器cpu过高的排查_线上服务器发生CPU占用率过高应该如何排查并定位问题?...

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

  4. 原创|面试官:线上服务器CPU占用率高如何排查定位问题?

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

  5. 服务器定位cpu高占用率代码php,面试官:线上服务器CPU占用率高如何排查定位问题?,...

    面试官:线上服务器CPU占用率高如何排查定位问题?, 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果 ...

  6. 面试官:线上服务器CPU占用率高如何排查定位问题?

    开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...

  7. 线上服务器CPU占用率高如何排查定位问题?

    (关联着看看这篇文章:https://blog.csdn.net/u011277123/article/details/103768939) 解决问题的能力以超高比例排名第一,这也是为什么很多面试过程 ...

  8. 解决线上问题-定位CPU占用过高

    如果线上服务器CPU占用率过高,如何定位问题呢? 1.使用 top 命令查看占用CPU最高的pid 2.使用 top -H -p pid或 top -Hp pid命令查看占用cpu最大的线程id即 t ...

  9. 线上服务器CPU负载过高的问题解决过程

    线上服务器CPU负载过高的问题解决过程 一.找到CPU占用过高进程 执行top命令,发现PID为12443的Java进程占用CPU高达350%,出现故障. 二.定位具体线程或代码 找到该进程后,接下来 ...

最新文章

  1. 关于android.view.WindowLeaked的解决方案
  2. Mybatis like查询的写法--转载
  3. 抓取html的地址怎么写,html js 获取地址栏参数
  4. Spark跟Flink的常见问题
  5. mac的ideal终端中mvn命令不生效 commang not found
  6. 前端面试被问到性能优化该肿么办!
  7. css background size
  8. linux spidev 应用_Linux下SPI驱动的移植和应用程序的测试
  9. realtek网卡mac硬改工具_浅谈设备异常、手机硬改参数
  10. 简单的高可用集群实验
  11. jQuery 学习-样式篇(八):jQuery 设置元素的 CSS 样式
  12. 洛谷—— P1268 树的重量
  13. PBXCp Error
  14. [LeetCode]Palindrome Number 推断二进制和十进制是否为回文
  15. 计算机专业学不学画法几何,高数难呀,学不懂不只从哪下手,还有画法几何
  16. 前端构建和模块化工具-coolie
  17. 水下声学的基本声学量介绍
  18. UWB高精度定位落地:中大型区域动态人员精细网格化管理
  19. wifi动不动就断开_解决iPad连接wifi网络经常中断(转)
  20. creo5.0安装教程

热门文章

  1. sql2000的安装以及sp4的升级
  2. gms认证流程_Google GMS认证要求与申请流程
  3. 云端敏捷部署单节点MySQl与Redis服务(以Ubuntu为例)
  4. Spring Cloud之微服务之间相互调用、如何让一个微服务调用另外一个微服务
  5. 7-38 实验7_3_奇数偶数 (100 分)奇数偶数排序
  6. 垂直领域知识图谱_垂直知识图谱的构建与应用研究
  7. Shader实现马赛克
  8. 从源码角度浅谈IRP
  9. nuc element i5-8265U黑苹果配置
  10. Transformer理解