服务器定位cpu高占用率代码php,面试官:线上服务器CPU占用率高如何排查定位问题?,...
面试官:线上服务器CPU占用率高如何排查定位问题?,
国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:
排名前几的比较受重视的能力分别为:解决问题、编程语言熟练程度、Debug、系统设计和性能优化。
解决问题的能力以超高比例排名第一,这也是为什么很多面试过程中,面试官都喜欢问如下问题:
这些,都是比较常见的问题,还有一些比较具体的问题也是建议很多开发者都需要掌握的,如:
这些问题的回答,一方面考察了面试者是否具有很强的实战经验,另外一方面也能体现出其解决问题的能力。
毋庸置疑,作为开发人员来说,定位并解决问题的能力是至关重要的。因为一旦线上发生了问题,如CPU占用率高,如果不及时解决,很容易导致网站响应慢、服务器宕机等问题。
那么,书归正传,本文我们就来简单介绍一下,如果线上服务器发生CPU占用率过高的问题时,应该如何排查并定位问题。
1、问题发现
本文整理自一个真实的案例,是楼主负责的业务,在一次大促之前的压测时发现了这个问题。
在每次大促之前,我们的测试人员都会对网站进行压力测试,这个时候会查看服务的cpu、内存、load、rt、qps等指标。
在一次压测过程中,测试人员发现我们的某一个接口,在qps上升到500以后,CPU使用率急剧升高。
CPU利用率,又称CPU使用率。顾名思义,CPU利用率是来描述CPU的使用情况的,表明了一段时间内CPU被占用的情况。使用率越高,说明你的机器在这个时间上运行了很多程序,反之较少。
2、问题定位
遇到这种问题,首先是登录到服务器,看一下具体情况。
定位进程
登录服务器,执行top命令,查看CPU占用情况:
$top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ 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 USER PR NI VIRT RES SHR S %CPU %MEM TIME+ 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
at sun.misc.URLClassPath$Loader.findResource(URLClassPath.java:684)
at sun.misc.URLClassPath.findResource(URLClassPath.java:188)
at java.net.URLClassLoader$2.run(URLClassLoader.java:569)
at java.net.URLClassLoader$2.run(URLClassLoader.java:567)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findResource(URLClassLoader.java:566)
at java.lang.ClassLoader.getResource(ClassLoader.java:1093)
at java.net.URLClassLoader.getResourceAsStream(URLClassLoader.java:232)
at org.hibernate.validator.internal.xml.ValidationXmlParser.getInputStreamForPath(ValidationXmlParser.java:248)
at org.hibernate.validator.internal.xml.ValidationXmlParser.getValidationConfig(ValidationXmlParser.java:191)
at org.hibernate.validator.internal.xml.ValidationXmlParser.parseValidationXml(ValidationXmlParser.java:65)
at org.hibernate.validator.internal.engine.ConfigurationImpl.parseValidationXml(ConfigurationImpl.java:287)
at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:174)
at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111)
at com.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高占用率代码php,面试官:线上服务器CPU占用率高如何排查定位问题?,...相关推荐
- 面试官:线上服务器CPU占用率高如何排查定位问题?
开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...
- 服务器主体信息截图,puppeteer实现线上服务器任意区域截图
整个九月份由于业务繁重以及玩心颇重,一直没有机会来写一篇博文.而且笔者于十月一日将会举办人生大事--婚礼,现在家里筹办过程中只能抽出零碎的时间来写这篇文章. 关于服务端截图,这种使用场景非常少见,大多 ...
- 线上服务器登记的要点
一家公司的线上服务器就是一家公司的大脑.如何公司的线上服务器出现任何问题,影响的将是公司的全部. 现在是互联网公司一般都有会将自己的服务器部署在云端,通过购买云服务来实现公司的生产.这样既可以减少运维 ...
- window服务器cpu过高的排查_线上服务器发生CPU占用率过高应该如何排查并定位问题?...
国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...
- 原创|面试官:线上服务器CPU占用率高如何排查定位问题?
国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...
- 服务器cpu占用率高怎么解决,线上服务器CPU占用率高怎么办?
如果线上服务器发生CPU占用率高时,应该如何排查并定位问题. 1.问题发现 本文整理自一个真实的案例,是楼主负责的业务,在一次大促之前的压测时发现了这个问题. 在每次大促之前,我们的测试人员都会对网站 ...
- 线上服务器CPU占用率高如何排查定位问题?
(关联着看看这篇文章:https://blog.csdn.net/u011277123/article/details/103768939) 解决问题的能力以超高比例排名第一,这也是为什么很多面试过程 ...
- 线上服务器CPU负载过高的问题解决过程
线上服务器CPU负载过高的问题解决过程 一.找到CPU占用过高进程 执行top命令,发现PID为12443的Java进程占用CPU高达350%,出现故障. 二.定位具体线程或代码 找到该进程后,接下来 ...
- 500并发 一台服务器的性能_面试官绝杀:系统是如何支撑高并发的?
作者 | 中华石杉 责编 | 伍杏玲 本文经授权转载石杉的架构笔记(ID:shishan100) 很多人面试的时候被问到一个让人特别手足无措的问题:你的系统如何支撑高并发? 大多数同学被问到这个问题压 ...
最新文章
- 评估“不合格”!教育部暂停山东大学、复旦大学、南京师范大学部分硕士、博士学位授权点...
- 内存管理代码分析 stm32
- web前端教程:如何理解JavaScript的单线程?
- 数据类型不匹配_笔记 | 自学Python 06:数据类型之列表
- 原来Java大数据才是真正的高富帅!
- [Android]Log打印
- C/C++ —— signed 与 unsigned 有符号和无符号数及其移位
- php log日志管理,PHP日志LOG类定义与用法示例
- Android 直播礼物动画实现之SVGA动画
- 普通微型计算机就是多媒体计算机,6-多媒体技术试题
- htmla标签下划线去除_div css网页开发布局时a标签去掉下划线
- Linux 下du命令详解及代码实现
- SAP-ABAP-如何查找系统中已经存在的增强(包括1代2代3代BTE表字段增强等)和标准的增强点
- 计算机知识小口诀,字根表口诀怎么快速背-小学数学:一年级20以内加减法口诀表,附背诵技巧!...
- 固态变 SATAFIRM S11
- P4188 [USACO18JAN]Lifeguards S
- 一点一滴岗位测试答案_【一点资讯】部编版语文六年级下第三单元综合测试卷(含答案)...
- 这些软件可以快速实现图片翻译文字
- 输入半径与高求圆周长、面积,圆球表面积、体积,圆柱表面积、体积
- 医院机房建设A类机房建设标准和B类、C类机房建设标准有什么差别
热门文章
- The requested contract was not found
- abaqus 根据坐标施加载荷- Analytical Field 载荷映射
- ccs dat数据 matlab,详解CCS中的.dat文件
- 打造数据中台,为企业提供智能服务
- 终于,月入 20000 !!
- Express获取请求参数
- Visual studio 默认不支持x64下__asm{}内联汇编的解决方案(含资源共享)
- 详细解析浏览器加载网页的整个过程
- 小程序组件获取元素宽高失效 和canvas绘制问题
- shell去掉输出的末尾换行符