最近在測試環境的服務器上,無心中發現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就降下來了