鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 這篇文章主要給大家介紹了關於Linux系統中CPU占用率較高問題排查思路與解決方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Linux具有一定的參考學習價值,需要的朋友們下麵來一起學習學習吧 前言 作為 Linux 運維工程師,在日常工 ...
鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站
這篇文章主要給大家介紹了關於Linux系統中CPU占用率較高問題排查思路與解決方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Linux具有一定的參考學習價值,需要的朋友們下麵來一起學習學習吧
前言
作為 Linux 運維工程師,在日常工作中我們會遇到 Linux伺服器上出現CPU負載達到100%居高不下的情況,如果CPU 持續跑高,則會影響業務系統的正常運行,帶來企業損失。
很多運維的同學遇到這種狀況往往會不知所措,對於CPU過載問題通常使用以下兩種方式即可快速定位:
方法一
第一步:使用
top命令,然後按shift+p按照CPU排序
找到占用CPU過高的進程的pid
第二步:使用
top -H -p [進程id]
找到進程中消耗資源最高的線程的id
第三步:使用
echo ‘obase=16;[線程id]’ | bc或者printf “%x\n” [線程id]
將線程id轉換為16進位(字母要小寫)
bc是linux的計算器命令
第四步:執行
jstack [進程id] |grep -A 10 [線程id的16進位]”
查看線程狀態信息
方法二
第一步:使用
top命令,然後按shift+p按照CPU排序
找到占用CPU過高的進程
第二步:使用
ps -mp pid -o THREAD,tid,time | sort -rn
獲取線程信息,並找到占用CPU高的線程
第三步:使用
echo ‘obase=16;[線程id]’ | bc或者printf “%x\n” [線程id]
將需要的線程ID轉換為16進位格式
第四步:使用
jstack pid |grep tid -A 30 [線程id的16進位]
列印線程的堆棧信息
案例分析
結合上面來做。
場景描述
生產環境下JAVA進程高CPU占用故障排查
解決過程
1、根據top命令,shift+p,發現PID為41673的Java進程占用CPU高達250%,出現故障。
2、找到該進程後,如何定位具體線程或代碼呢,首先顯示線程列表,並按照CPU占用高的線程排序:
[root@localhost ~]# ps -mp 41673 -o THREAD,tid,time | sort -rn
顯示結果如下:
3.將需要的線程TID轉換為16進位格式
[root@localhost ~]# printf "%x\n" 41846
a376
4、最後使用jstack命令列印出該進程下麵的此線程的堆棧信息:
[root@localhost ~]# jstack 41673 |grep "a376" -A 30
解決辦法
1、根據top命令,shift+p,發現PID為41673的Java進程占用CPU高達250%,出現故障。
2、根據pid查看他的進程看看是什麼服務占用這麼高
ps -ef |grep -v grep | grep 41673
3、查看到是一個java進程占用這麼高,然後看看有沒有用,沒有用的話就殺掉它
kill -9 41673
4、再次top查看cpu整體就降下來了。
原文鏈接:https://blog.csdn.net/liu_chen_yang/article/details/124320046