线上处事器CPU占用率高怎么办?

假如线上处事器产生CPU占用率高时,应该如何排查并定位问题。

线上处事器CPU占用率高怎么办?

1、问题发明

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

在每次大促之前,我们的测试人员城市对网站举办压力测试,这个时候会查察处事的cpu、内存、load、rt、qps等指标。

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

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、问题办理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9724.html