12
ferd.ca -> Lessons Learned while Working on Large-Scale Server Software (ferd.ca)
IngramChen 積分 9 編輯於

看的我膽顫心驚。如果維護一個長久的服務 (也不用太大) 多半會踩到這篇文章說的。

Debugging is a Science

有同感,大型的 server 通常混了一大堆邏輯,時間久了,會越來越難找 root cause。比方說上個禮拜我們遇到的問題:某個地方存取忽然變多了,server loading 變很大,但是查了老半天卻查不出來 (我們往最近的更新去找,但查了沒結果),很吐血。

但是還是要查出 bug 啊,我們的流程就是一直重覆:查最近的異動 -> 建立假說 -> 不可能就換另一個方向 -> 假說可行的話就試試 -> 實驗失敗就重頭來 -> 換另一個假說。

通常歷經了三~五輪的假說後才會發現真正的 root cause (時間不定,有時要一、二個月後才會發現)。最後找到 root cause 並解決是可喜可賀啦,但前面自己提的假說一直被打臉也是蠻冏的。(嘛,我發現我臉皮越來越厚了...)

Long Running Systems Have Their Own Bugs

這一點提的經驗很有意思:現在流行 continuous deployment,所以每天上線新的程式是常態,但是因為常常 restart,很多長期的疾病不會顯現出來。直到開發團隊轉往另外一個專案忙時,原來的專案過了幾個月都沒更新/重啟,然後長期性疾病就冒出來了 (通常是 leak 居多)。

這裡我的經驗與作者相同,我自己也遇到很多次了,這算是 continous deployment 的 副作用 吧?常吃抗生素病很快好但長期下來會留下一些看不見的問題。怎麼解決這種 bug ?這可不是剛上線產生的那種熱騰騰的 bug,它可能是一年前就存在了,你往最近的程式更新去查,查不出來很正常的。怎麼辦?就回到上面提的 假說>打臉>假說>打臉>... 這樣的循環了,等到臉夠腫了自然就會找到 bug 了。

qrtt1 積分 3

永遠難忘幾年前還沒上 git 時,有人寫了

select * from a_very_large_table;

讓 MIS 連二週都崩潰地起凌晨顧機器到天快亮,開發者都覺得不是自己的問題,也沒有人承認有寫這樣的 code。那時的主要異動不是 code,而是接收了其他團隊的人員,他寫了一個「練習」的程式在他正在常發的 web page 上,並且 commit 進了 cvs。

遇到 2 次 query,jvm heap 就暴了