記一次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就降下來了

相關文章
相關標籤/搜索