手里拿著錘子時(shí)眼里只能看到釘子
今天線上的應(yīng)用出問題了。
問題現(xiàn)象是
待渲染的頁面一共要請求兩個(gè)接口。這兩個(gè)接口一直在請求,基本上要一分鐘多響應(yīng)完成,但完成并不是正常顯示,而是返回500的錯(cuò)誤服務(wù)器錯(cuò)誤。 |
聽到PM反饋問題后,經(jīng)驗(yàn)主意上身,二話不說,上手開始分析。
第一步從線上服務(wù)器的日志開始入手。在線上日志查看時(shí)發(fā)現(xiàn)日志文件中最新的內(nèi)容并不是附近的時(shí)間,而是一個(gè)小時(shí)前 -- 后續(xù)的日志都沒有輸出到文件中。
發(fā)現(xiàn)這個(gè)現(xiàn)象后,感覺日志輸出不了,可能是和磁盤空間有關(guān), 使用 df 命令開始查看空間。
果然,Tomcat 所在的目錄,磁盤使用已經(jīng)達(dá)到了100%。再切換回 Tomcat 日志目錄發(fā)現(xiàn)大量的日志文件,果斷把前面一些舊的已經(jīng)數(shù)據(jù)分析統(tǒng)計(jì)過的刪除。應(yīng)用開始正常。
此時(shí)以為已經(jīng)解決了問題,在群里和相關(guān)同學(xué)說是因?yàn)榇疟P滿導(dǎo)致的,一切OK。
中午吃個(gè)飯的時(shí)間,應(yīng)用又出問題了,還是老樣子。心想剛清的磁盤,空間還有一些,就開始使用上一篇?jiǎng)倢戇^的 jstack,打出 stackTrace 之后,分析內(nèi)容中的Tomcat線程工作情況,又隔一段時(shí)間再打一個(gè)互相對比,自己感覺該比的都比了,也沒發(fā)現(xiàn)任何有阻塞或者死鎖的情況,此時(shí)應(yīng)用的情況是偶爾一次頁面會(huì)渲染成功,但也是比較慢的,大部分時(shí)候都不成功。
以前遇到過一次頁面渲染慢是因?yàn)楹笈_(tái)存放到云上的文件在保存完之后,沒有進(jìn)行 close 操作,把連接點(diǎn)滿了,導(dǎo)致后面的請求都超時(shí),當(dāng)時(shí)通過 jstack 發(fā)現(xiàn)了問題之后快速解決了問題。所以這一次因循老路,還按這個(gè)思路來分析。
線上服務(wù)是部署在四臺(tái)機(jī)器上,還分析了四臺(tái)機(jī)器上的日志,也沒看到請求的信息到達(dá)過其他機(jī)器上,所以一直在之前磁盤滿的那一臺(tái)機(jī)器上分析。
此時(shí) QA 同學(xué)告知,另外三臺(tái)機(jī)器上的日志一直沒有刷出來,很長時(shí)間了。這時(shí)才想到可能是另外三臺(tái)機(jī)器的磁盤空間也滿了,日志輸出不出來,在請求分配到這些節(jié)點(diǎn)上時(shí)分導(dǎo)致頁面渲染不成功,而如果請求到達(dá)了第一臺(tái)刪除過的機(jī)器上,頁面會(huì)渲染。
把另外三臺(tái)機(jī)器的磁盤也清理了一下,果然,應(yīng)用可能正常且快速的響應(yīng)了。
這個(gè)問題分析時(shí),在應(yīng)用頁面渲染慢時(shí),分析了第一臺(tái)機(jī)器的磁盤問題,之后就一根筋的順著性能響應(yīng)這條路去分析了,一會(huì) jstack, 一會(huì)看下 GC 的執(zhí)行是否正常 ...
忘了請求會(huì)分發(fā)到另外三臺(tái)機(jī)器上,也沒有在清理第一臺(tái)機(jī)器磁盤時(shí)順便上去看一下。
真的是手里拿著錘子,眼里就只能看到釘子。 甚至有些內(nèi)容,即使和過往經(jīng)驗(yàn)有類似的地方,也不見得就一定是同樣的問題。有時(shí)候真需要放下錘子仔細(xì)看看,不能埋頭就上啊。
想起之前暗時(shí)間的作者劉未鵬寫過一次這樣的經(jīng)歷:
說當(dāng)時(shí)和他老婆一起到銀行取錢。走到銀行門前,發(fā)現(xiàn)需要刷卡才能進(jìn)去,刷了下銀行卡進(jìn)去了。取完錢出來,未鵬拿了一張不是銀行卡的普通卡,刷了一次也把門打開了,這時(shí)他認(rèn)定是這門鎖有問題,只有刷個(gè)卡就能進(jìn),不停的刷了好幾張卡。
這時(shí)他老婆提醒道:萬一是這門壞了呢,可能都不用卡。
未鵬伸手一推,門開了。
未鵬在寫這個(gè)經(jīng)歷時(shí)說,有時(shí)候我們?nèi)菀仔纬伤季S定勢,更愿意從自己熟悉的角度去考慮問題,而忽視本來已經(jīng)暴露出的現(xiàn)象。
有些時(shí)候,遇到問題時(shí),放下手里的錘子,站遠(yuǎn)些看一看,可能會(huì)有新的認(rèn)識。軟件開發(fā)中還有一條著名的橡皮鴨法則,就是在陷入自己的思路時(shí),向放在桌上的橡皮鴨講一講,可能在講的過程中自己就明白了。不套用經(jīng)驗(yàn),多搜集信息,再分析,而不陷入思維定勢中,也許才是解決問題的好方法。
【本文為51CTO專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號『Tomcat那些事兒』獲取授權(quán)】