最近在测试环境的服务器上,无心中发现cpu持续飙高。最高的时候达到了200%通过反复重启无效以后,决定挖掘深层次的缘由java
在文件中能够看到一行怪异的信息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
能够看出该进程每秒都在被动的切换上下文,并且数量很大
用pstack查看一下线程日志
彷佛是sleep的问题,未完待续。。。。
-------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------
跨度有点久了,如今终于找到了问题根源
经过线程分析工具,打印出了占用cpu最高的方法调用
bash show-busy-java-threads
原来是target目录下dubbo文件的权限有问题,由于该文件不是当期用户权限,因此读取的时候产生了死循环,致使cpu飙高
把这个文件的权限改为当前用户,而后重启一下tomcat。cpu就降下来了