记一次cpu指标异常的跟踪排查

问题描述:

最近在测试环境的服务器上,无心中发现cpu持续飙高。最高的时候达到了200%通过反复重启无效以后,决定挖掘深层次的缘由java

 

经过top命令打印出消耗cpu的pid,如图

 

 经过ps -mp 24597 -o THREAD,tid,time,找出进程中cpu占用率最高的tid

经过  jstack -F tid >> tid.log打印出该进程下的线程信息

在文件中能够看到一行怪异的信息web

从线程信息中,能够看到,彷佛是这个线程调用某一个dubbo服务的时候,线程阻塞了,持续消耗cputomcat

排查以后没有结论。。。bash

 

-------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------服务器

 

换一种排查方式。。。并发

vmstat 1 10 命令看一下可能存在的问题函数

下图中能够发现in和cs值有些异常工具

in:表示每秒cpu中断的次数测试

cs:表示每秒产生的 上下文切换数。咱们调用函数,就要进行上下文切换;线程间的切换,也要进程上下文切换。spa

这个值越小越好,太大了,要考虑调低线程或者进程的数目。

咱们作大并发测试时,选择web服务器的进程能够从进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值。

另外,每次调用系统函数,咱们的代码就会进入内核空间,致使上下文切换,这个很耗资源,要尽可能避免频繁调用。

上下文切换次数过多表示你的CPU大部分浪费在上下文切换,致使CPU不能充分利用和正常工做。

in和cs值越大,表示内核消耗的cpu越多

 

接下来咱们看一下关键进程的上下文切换数

先找出消耗cpu最大的进程

top -Hp 24597

pid =24619

 

查看一下该进程的上下文切换数

 pidstat -p 24619 -w 1 10

  • PID:进程id
  • Cswch/s:每秒主动任务上下文切换数量
  • Nvcswch/s:每秒被动任务上下文切换数量
  • Command:命令名

 

能够看出该进程每秒都在被动的切换上下文,并且数量很大

 

用pstack查看一下线程日志

彷佛是sleep的问题,未完待续。。。。

 

-------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------

跨度有点久了,如今终于找到了问题根源

经过线程分析工具,打印出了占用cpu最高的方法调用

bash show-busy-java-threads

原来是target目录下dubbo文件的权限有问题,由于该文件不是当期用户权限,因此读取的时候产生了死循环,致使cpu飙高

 

把这个文件的权限改为当前用户,而后重启一下tomcat。cpu就降下来了

相关文章
相关标签/搜索