背景:經過性能監控發現上線服務器cpu某核佔用率已經達到了100%,並且是由咱們的某個核心服務致使的。幸好因爲咱們的服務進程由多個相同worker(線程)調度承擔的,因此除了CPU佔用率高以外,並無對服務形成影響。隨着上次咱們找到那個吃IO的罪犯,此次咱們要追捕的是潛伏在團體中的特務,更加驚險刺激喲!程序員
系統環境服務器
用top命令很容易定位到是誰佔用CPU最高。多線程
以咱們的這個業務進程(imDevServer)舉例,爲何說這貨是個潛伏者呢?由於這是個多線程的進程,咱們要知道實際上佔用cpu的最小單位是線程,因此確定是衆線程中的某一個或幾個佔用CPU太高致使的。top -H -p pid命令查看進程內各個線程佔用的CPU百分比ide
如上圖所示咱們能夠看出id爲8863的線程cpu佔用率最高。好,咱們如今只要能找到他偷走的cpu就行了,雖然這小子嘴巴嚴,可是咱們有一套完善的審問流程,不怕他不招。首先出馬的是strace -T -r -c -p pid命令oop
它的做用是查看系統調用和花費的時間,epoll_wait雖然佔用的調用時間多,可是他自己是個正常的阻塞調用。性能
咱們接着讓pstack pid出馬spa
能夠看到每一個線程的調用堆棧,找到已經找出的佔用CPU最高的那個線程,而後看他的調用堆棧,很容易看出在哪一步邏輯上致使了busy loop,線程
再使用trace -p tid看看線程的調用過程接着定位到代碼,修復bug,找回被偷走的cpu。3d
後記:其實做爲一個程序員,我感受最大的樂趣不是洋洋灑灑的寫程序,而是去尋找一些「高端」bug,也許就和有些刑警癡迷於偵破案件同樣,這就是對技術的熱愛。code