CPU高負載排查小技巧,細心的優化可能為公司節省一個億!
女主宣言
服務優化是一個細心、漫長的過程,一個很小的優化不僅可以為用戶帶來更穩定更快速的互聯網體驗,也許還會為公司降低百萬以上的成本。熟練掌握服務端排錯技巧,已經是「匠心工程師」的標配技能。這篇CPU排錯小技巧,希望能夠幫助到大家。
PS:豐富的一線技術、多元化的表現形式,盡在「HULK一線技術雜談」,點關注哦!
前言
為了能夠支撐大並發並且合理的利用機器資源,一台伺服器部署了n個tomocat的java微服務、或者是同時開啟了多個埠的fastcgi,這些其實都是很正常的操作。但是往往會出現某一個實例的某個方法的執行,導致cpu負載非常高從而引發報警。當然,很多同學的第一想法就是「擴容」,於是便找到OPS的兄弟「給我擴xx台機器」,浪費了資源先不說,但是這樣往往解決不了實質性的問題,畢竟不是可以無限擴容機器的。那麼我們怎麼排查此類問題做好優化工作呢?今天就給大家舉例說明,希望同學們get這個小技能後多多使用,不斷磨練自己的程序,說不定你的耐心優化,就會為公司節省1個億的小目標!
步驟
步驟一:找到最耗CPU的進程
工具:top
方法:
執行top -c ,顯示進程運行信息列表;
鍵入P (大寫p),進程按照CPU使用率排序;
如上圖,最耗CPU的進程PID為18154
步驟二:找到最耗CPU的線程
工具:top
方法:
top -Hp 18154 ,顯示一個進程的線程運行信息列表
鍵入P (大寫p),線程按照CPU使用率排序
如上圖,進程18154內,最耗CPU的線程PID為15259
步驟三:將線程PID轉化為16進位
工具:printf
方法:
如上圖,15259對應的16進位是0x3b9b,當然,這一步可以用計算器
之所以要轉化為16進位,是因為堆棧里,線程id都是用16進位表示的。
步驟四:查看堆棧,找到線程在幹嘛
工具:pstack/jstack/grep
方法:jstack -F 15259 | grep 『0x3b9b』
列印進程堆棧
通過線程id,過濾得到線程堆棧
如上圖,找到了耗CPU高的線程對應的線程名稱「main」方法,以及看到了該線程正在執行代碼的堆棧。
步驟五:列印的結果看起來不是很明顯,那我們就直接jstack寫到文件
工具:jstack
方法:jstack -l 15259 > 15259.stack
列印進程堆棧
通過線程id找到15259.stack,然後通過0x3b9b搜索
總結
服務優化是一個細心、漫長的過程,一個很小的優化不僅可以為用戶帶來更穩定更快速的互聯網體驗,也許還會為公司降低百萬以上的成本。熟練掌握服務端排錯技巧,已經是「匠心工程師」的標配技能。這篇CPU排錯小技巧,希望能夠幫助到大家,多用多用,體會一下系統調優的樂趣。最後附上一張圖,每個系統排錯、優化的命令等待著你去發掘。
HULK一線技術雜談
由360雲平台團隊打造的技術分享公眾號,內容涉及雲計算、資料庫、大數據、監控、泛前端、自動化測試等眾多技術領域,通過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享


TAG:HULK一線技術雜談 |