Linux下排查进程占用cpu高的问题
相信很多C++程序員都經(jīng)歷程序占用cpu過高的問題,這種問題,如果對代碼運行邏輯足夠熟悉,只靠腦子想估計定位起來也不難,但是如果是調(diào)用第三方sdk,或者團隊其他人開發(fā)的庫導(dǎo)致的cpu占用居高,就不那么容易定位了。
如何確定程序cpu占用情況?
這個非常簡單,一條命令搞定,top -p 進程pid,這樣就可以:
這樣就可以持續(xù)的觀察你的程序的cpu占用情況,如果一直居高不下,就可能是有問題了。??從圖中可以看到%CPU為98.0,這已經(jīng)非常非常高了。
如何查看線程級別的cpu占用情況?
方法一:
命令:
ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu | grep 進程號這個比較長,理解一下也不難記憶,這里我們可以看到用戶、進程號、父進程號、線程號、cpu占用總時長、cpu占用率、程序名。按照cpu的值進行了升序排列,最后一個即為占用cpu最高的線程,這樣就可以找到對應(yīng)線程號。
圖中第4列就是線程號,第5列是cpu占用時長,第6列是cpu占用率,可以看到54313線程占用CPU最高。
方法二:
命令:
top -H -p 進程號-H :Threads-mode operation -p :Monitor-PIDs這個就很好記了,推薦用這個!一目了然,動態(tài)顯示各個線程的cpu占用情況,很容易找出最高的那個。
??圖中%CPU列很清晰的列出了cpu的占用狀況,也可以看出54313線程占用cpu最高。
細心的同學發(fā)現(xiàn)了,為什么這兩種方法得到的數(shù)據(jù)不一樣?莫非不對?其實都是對的,只是計算用的數(shù)據(jù)不同,top得到的是瞬時的cpu占用率,top數(shù)據(jù)默認3秒刷新一次,所以計算的是這3秒內(nèi)線程占用CPU時長占比,而ps計算的是從啟動到現(xiàn)在的一個時長占比,運行時間越長,就會趨近于某個固定值,感興趣的同學可以了解一下cpu占用率的算法。
如何將問題定位到代碼行級別?
通過上面的操作我們已經(jīng)找到了那個搞事情的線程,但是線程長得都一個鬼樣子,我們只能看到一個代表它的數(shù)字,此時需要一個建立一個線程號與具體代碼的映射關(guān)聯(lián),那么就需要用到這幾個查看堆棧信息的強大工具了。
gstack/pstack(c/c++程序)
命令:
gstack/pstack 進程號這兩個其實一個工具,pstack是gstack的軟連接而已。
總結(jié)
以上是生活随笔為你收集整理的Linux下排查进程占用cpu高的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于C++11的线程池
- 下一篇: linux命令-- pstack命令(跟