【這是一猿小講的第?35?篇原創(chuàng)分享】
你有沒有經(jīng)歷過:一大早就被瘋狂的報警炸醒,由于線上應(yīng)用 CPU 占用率過高 ......
你有沒有經(jīng)歷過:剛到公司酸役,板凳還沒有捂熱,收件箱里卻一堆的客服投訴郵件驾胆,需要你排查日志定位問題?......?
你有沒有經(jīng)歷過:下班的鐘聲即將敲響簇捍,但是你還要加班,進(jìn)行統(tǒng)計應(yīng)用每秒俏拱、每分鐘的峰值等各個指標(biāo) 暑塑,由于 BOSS 要拿這些指標(biāo),在明天的技術(shù)大會上對外吹牛?......
你有沒有經(jīng)歷過:深夜正在酣眠锅必,值班的運(yùn)維瘋狂給你打 CALL事格,由于線上應(yīng)用內(nèi)存出現(xiàn)了問題?......
我敢保證上面的場景,大概率你都經(jīng)歷過搞隐。講真驹愚,其實無論你是否經(jīng)歷過,今天你都算來著啦劣纲。因為我將要結(jié)合以往的經(jīng)歷總結(jié)逢捺,在猿門開壇設(shè)法,掏出葵花寶典施展一二癞季。
水滴石穿非一日之功劫瞳,冰凍三尺非一日之寒,羅馬并非一日建成的绷柒,經(jīng)驗也并非一坑而促成的志于,防狼有術(shù),我們先從全局废睦,看一看這部技術(shù)寶典(看不清沒關(guān)系伺绽,感覺到很牛掰就行)。
這部技術(shù)寶典真的很硬核,主要分四大招奈应,見招拆招澜掩,讓我們一一進(jìn)行拆解。
第?1?招:線上應(yīng)用占用 CPU 過高杖挣。
拆~招:
采用 top 命令肩榕,找出 CPU 占用最高的進(jìn)程 PID;
通過 ps -ef | grep PID 查看對應(yīng)的應(yīng)用程梦,看看是誰在作祟点把;
采用 jstack -l? PID >> PID.log 獲取進(jìn)程的堆棧信息;
采用 ps -mp PID -o THREAD,tid,time 拿到占用 CPU 最高的線程 tid屿附;
采用 printf "%x\n" tid 獲取 16 進(jìn)制的線程 TID郎逃;
采用 grep TID -A20 PID.log 確定是線程哪兒出了問題。
最~后:腿疼醫(yī)腿挺份,辨癥施治褒翰,對癥下藥。找準(zhǔn)代碼位置匀泊,進(jìn)行調(diào)整代碼优训。
第?2?招:線上應(yīng)用內(nèi)存溢出。
拆~招:
采用 top 命令各聘,找出應(yīng)用對應(yīng)的 PID揣非;
采用 jmap -heap PID 確認(rèn)一下分配的內(nèi)存少不少;
采用 jmap -histo:live PID | more 找出分析最耗內(nèi)存的對象【留意占用多少G的對象】躲因;
采用 ps -efL | grep PID | wc -l 查看進(jìn)程創(chuàng)建的線程數(shù)早敬;
采用 ll /proc/PID/task | wc -l 也可以查看進(jìn)程創(chuàng)建的線程數(shù);
采用?netstat?-apn?|?grep?PID?|?wc -l 查看進(jìn)程網(wǎng)絡(luò)連接數(shù)大脉。
最~后:腿疼醫(yī)腿搞监,辨癥施治,對癥下藥镰矿。
a. 如果內(nèi)存分配確實小琐驴,適當(dāng)調(diào)整內(nèi)存;
b. 對象被頻繁創(chuàng)建秤标,且不釋放绝淡,優(yōu)化代碼;
c. 不斷創(chuàng)建線程或者不斷進(jìn)行網(wǎng)絡(luò)連接抛杨,優(yōu)化代碼够委。
第?3?招:排查業(yè)務(wù)問題。
拆~招:
采用 tail -fn 200 log_file 實時查詢線上日志怖现;
找準(zhǔn)日志搜所關(guān)鍵字keyWord,例如 orderId、mobileId屈嗤、reqId 等潘拨;
采用 grep keyWord log_file 查詢關(guān)鍵字所在的行的日志;
采用 grep -C n keyWord log_file 匹配關(guān)鍵字所在行的上下 n 行饶号;
采用 grep keyWord log_file | wc -l 匹配關(guān)鍵字的的行數(shù)有多少铁追。
最~后:根據(jù)實際排查日志場景進(jìn)行日志搜索 tail 、grep 用的最多茫船。
第?4?招:BOSS 的統(tǒng)計問題琅束。
拆~招:
采用 cat log_file 讀取日志文件;
采用 cut 命令截取出日志的時間戳算谈;
若按照秒統(tǒng)計截取到秒涩禀;若按照分鐘統(tǒng)計截取到分鐘;
采用 uniq -c 進(jìn)行去重統(tǒng)計然眼;
采用 sort -nr 按照第一列的數(shù)值大小進(jìn)行倒序艾船;
采用 head -1 只顯示第一行內(nèi)容。
最~后:統(tǒng)計問題迎刃而解高每,那么統(tǒng)計每秒峰值的命令該如何寫呢屿岂?
例如日志:?
1118?115856?066?-?REQID0000000000188?...?...
命令組合:
SecondPeak=`cat log_file|cut -d, -f1| cut -c 1-11|sort|uniq -c |sort -nr|head -1`
好了,今天的分享接近尾聲鲸匿,不知道你 get 到多少爷怀,懂與不懂,都建議你收藏带欢,以備不時之需运授;如果想讓更多人進(jìn)步,那不妨發(fā)揚(yáng)一下分享的精神洪囤,動動你的手指放肆的轉(zhuǎn)發(fā)一下徒坡。
歡迎關(guān)注微信公眾號“一猿小講”了解更多精彩分享。