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

国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:

排名前几的比较受重视的能力分别为:解决问题、编程语言熟练程度、Debug、系统设计和性能优化。

解决问题的能力以超高比例排名第一,这也是为什么很多面试过程中,面试官都喜欢问如下问题:1、你这个项目遇到的最大挑战是什么?如何解决的?

2、如果线上发生了报警你回如何排查呢?

3、你有解决过什么线上问题吗?

4、能列举几个你知道的排查Linux服务器线上问题的命令吗?

这些,都是比较常见的问题,还有一些比较具体的问题也是建议很多开发者都需要掌握的,如:1、线上服务器Load飙高如何排查?

2、线上服务器CPU占用率高如何排查?

3、线上服务器频繁发生Full GC如何排查?

4、线上服务器发生死锁如何排查?

这些问题的回答,一方面考察了面试者是否具有很强的实战经验,另外一方面也能体现出其解决问题的能力。

毋庸置疑,作为开发人员来说,定位并解决问题的能力是至关重要的。因为一旦线上发生了问题,如CPU占用率高,如果不及时解决,很容易导致网站响应慢、服务器宕机等问题。

那么,书归正传,本文我们就来简单介绍一下,如果线上服务器发生CPU占用率过高的问题时,应该如何排查并定位问题。一、问题发现

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

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

在一次压测过程中,测试人员发现我们的某一个接口,在qps上升到500以后,CPU使用率急剧升高。CPU利用率,又称CPU使用率。顾名思义,CPU利用率是来描述CPU的使用情况的,表明了一段时间内CPU被占用的情况。使用率越高,说明你的机器在这个时间上运行了很多程序,反之较少。二、问题定位

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

定位进程

登录服务器,执行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 javatop命令是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 451911a7

接下来,通过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.parseva lidationXml(ValidationXmlParser.java:65)  at org.hibernate.validator.internal.engine.ConfigurationImpl.parseva lidationXml(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行是有可能存在问题的。三、问题解决

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

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

四、总结

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

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

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

关于本次问题排查,你有什么想说的呢?欢迎交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux mv 命令使用介绍

文章目录1.命令格式2.命令功能3.命令参数4.命令实例1、文件改名( 重命名)2、移动文件3、将test目录下的文件text1.txt text2.txt text3.txt移动到目录mv中。4、将文件file1改名为file2,如果file…

Linux touch 命令使用介绍

文章目录1.命令格式2.命令参数3.命令功能4.使用范例1、创建不存在的文件,用法如下2、更新text.txt 的时间和text3.txt时间戳相同3、设定文件的时间戳-t time 格式详细说明linux中的touch命令一般用来修改文件时间戳&am…

qt怎么可以随意设置自己想要的表格_【Qt开发】QTableWidget的详细设置

在使用Qt不多的日子里,已经两次用到了QTableWidget这个控件,也慢慢的习惯和喜欢上了它。再使用QTableWidget的时候,已不像刚开始使用时的迷茫。嗯嗯。现在就来总结总结我与QTableWidget相识的历程......(*^__^*) 嘻嘻……使用时也查过不少资料…

Linux cat 命令使用介绍

文章目录1.命令格式2.命令功能3.命令参数4.使用实例1、输出两个文件的合并内容并显示行号2、两个文件合并内容并增加行号(空白行不加)之后将内容写到其他文件3、使用here doc来生成文件并向文件中输入内容,EOF输入可以…

thinkpad重装系统不引导_Thinkpad笔记本重装系统时无法UEFI启动进入PE怎么办

Thinkpad笔记本重装系统时无法UEFI启动进入PE怎么办?近日,有用户想要在Thinkpad笔记本中重装操作系统,但是发现无法UEFI启动并进入PE系统。如果想要通过PE进行Thinkpad笔记本系统重装操作的话,那么应该如何解决上述的问题呢?下面&#xff0…

Linux nl 命令使用介绍

文章目录1.命令格式2.命令参数3.命令功能4.使用例子1.用 nl 列出文件的内容2.nl 列出文件内容,空本行也加上行号3.让行号前面自动补上0,统一输出格式前面对cat做了介绍,现在继续介绍和cat有点类似的另外一个…

css 不规则边角_如何实现带有边角的CSS边框

以下是完整代码,拷贝到编辑器即可使用html>带四角的边框body {background: #00AB68;text-align: center;}#box {position: relative;margin: 120px auto;width: 400px;height: 100px;font-family: KaiTi;font-size: 18px;line-height: 100px;font-weight: bold;c…

Linux more 命令使用介绍

文章目录1.命令格式2.命令功能3.命令参数4.常用操作(键盘按键)命令5.示例1显示文件中从第3行起的内容2从文件中查找第一个出现”hello3“字符串的行,并从该处前两行开始显示输出3设定…

Linux less 命令使用介绍

文章目录1.命令格式2.命令功能3.命令参数4.按键操作5.示例1、查看文件内容2、ps查看进程信息并通过less分页显示3、查看命令历史使用记录并通过less分页显示5、浏览多个文件5.附加备注less命令也是对文件或…

python中的reindex_Pandas之ReIndex重新索引的实现

约定:import pandas as pdimport numpy as npReIndex重新索引reindex()是pandas对象的一个重要方法,其作用是创建一个新索引的新对象。一、对Series对象重新索引se1pd.Series([1,7,3,9],index[d,c,a,f])se1代码结果:d 1c 7a 3f 9…

Linux head/tail 命令使用介绍

文章目录1.命令格式2.命令功能3.命令参数headtail4.使用实例1:head显示文件的前n行2:head显示文件前n个字节3:head文件的除了最后n个字节以外的内容4:head输出文件除了最后n行的全部…

djpython教程_简单介绍Python的Django框架的dj-scaffold项目

由于Django没有象rails一样指定项目的目录结构规范,很多人都对django项目的目录结构要如何组织而感到困惑。为此我又新创建了一个开源项目dj-scaffold(django的脚手架)。这个项目用于自动生成一个标注化的django项目和app。项目地址:https://github.com/…

Linux cp 命令使用介绍

文章目录1.命令格式及用法2.命令功能3.命令参数4.示例一:复制单个文件到目标目录,文件在目标文件中不存在二:目标文件存在时,会询问是否覆盖三:复制整个目录命令执行演示…

Linux ps 命令使用介绍

文章目录前言Linux上进程有5种状态ps工具标识进程的5种状态码命令格式命令功能命令参数示例1:显示所有进程信息2:显示指定用户信息3:显示所有进程信息,连同命令行4: ps 与grep 常用组合用法,查找特定进程5&…

字符串去重_文件数据去重示例

【摘要】本文介绍小文件与大文件在进行数据去重时的几种处理办法,比如按整行或关键列去除重复数据或留下重复数据,并用 esProc SPL 举例实现。请点击文件数据去重示例了解详情在数据处理业务中,有时需要清除文件中的重复数据或只留下重复数据…

Android 11判断应用已安装坑点

文章目录Android 11 wxApi.isWXAppInstalled() 返回false解决办法1、在清单文件的添加queries标签2、增加权限3、app的targetSdkVersion 改为29原因与说明Android 11 获取已安装app列表问题Android 11 应用可见性官方说明特定软件包名称在库中与托管应用通信与 intent 过滤器签…

python推导式多行书写_python三种推导式的详细介绍及其应用示例,强调字典推导的重要性...

前言列表推导式构建列表的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。自python2.7以后,列表推导和生成器表达式的概念就应用到了字典上,所以就有了字典推导,以后我们还会遇到集合推导(此处暂不讨论)。因此&#x…

Linux watch命令使用介绍

文章目录1.命令格式2.命令功能3.命令参数4.示例1:每隔一秒高亮显示网络链接数的变化情况2:每隔一秒高亮显示http链接数的变化情况3:实时查看模拟攻击客户机建立起来的连接数4:监测当…

php7 setcookie无效_php COOKIE介绍和setcookie有时会在ie下失效问题

建立商业站点或者功能比较完善的个人站点,常常需要记录访问者的信息,在PHP中提供了两种方便的手段:session和cookie功能.为了永久的保持用户信息,则cookie是最便捷的手段.在这里我将为大家详细的讲解cookie的功能及使用方法.一: 设置cookie使…

Linux at命令使用介绍

目录1.命令格式2.命令功能3.命令参数4.示例1:三天后的下午 5 点执行 /bin/ls2:明天17点钟,输出时间到指定文件3:计划任务设定后,在没有执行之前,用atq命令来查…