背景是我今天發(fā)布一個(gè)新的程序度苔,剛更新完沒(méi)兩分鐘音诫,運(yùn)維就發(fā)現(xiàn)有幾個(gè)配置較低的服務(wù)器cpu負(fù)載很高攻泼,并確定以及肯定的告訴我就是我剛更新的程序?qū)е碌模S后便開(kāi)始了一步一步的檢查诡延。
ps: 大牛就忽略此文吧滞欠,本文主要是記錄下過(guò)程留著自己使用,以及剛出道的小弟弟or小妹妹正好遇到此問(wèn)題摸不著頭腦時(shí)候可以參考下
1. top之
當(dāng)時(shí)哥就蒙圈了肆良,為啥其他服務(wù)器好好的筛璧,這幾臺(tái)會(huì)出現(xiàn)問(wèn)題,然后想到這個(gè)程序是多線程的惹恃,所以有了第二步夭谤。
2. top -p 32563 -H
既然已經(jīng)知道是哪個(gè)線程占用的cpu資源,這就好辦了巫糙,開(kāi)始debug
3. import ctypes ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print "threaing id: ",ctypes.CDLL('libc.so.6').syscall(186)?
把上面那條放到所執(zhí)行的函數(shù)中就可以得到當(dāng)前函數(shù)的線程id朗儒,(ps:那個(gè)186我不知道干嘛,等有空可以深入研究下,畢竟作者是個(gè)誠(chéng)實(shí)耿直的boy醉锄。)光知道線程id還是遠(yuǎn)遠(yuǎn)不夠滴乏悄,還需要知道所執(zhí)行的函數(shù)名
4. print sys._getframe().f_code.co_name
這樣就已經(jīng)把問(wèn)題范圍縮小到了某個(gè)函數(shù)范圍內(nèi),至于具體問(wèn)題就因人而異了恳不,具體問(wèn)題我會(huì)發(fā)布另一篇文章供大家參考
在解決問(wèn)題當(dāng)中還學(xué)到不少其他東西檩小,所以貼出來(lái)以備后用:
strace -p 29014 #跟蹤線程所有的調(diào)用?
pstack 4551 #進(jìn)程棧跟蹤?
ps -mp pid -o THREAD,tid,time #顯示線程列表
ss #命令用于顯示socket狀態(tài). 他可以顯示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix domain sockets等等統(tǒng)計(jì). 它比其他工具展示等多tcp和state信息. 它是一個(gè)非常實(shí)用、快速烟勋、有效的跟蹤IP連接和sockets的新工具