大文件讀寫獨占磁盤引發的故障
故障現象:
某應用主要功能是管理用戶圖片,但是上傳圖片突然非常慢。
原因分析:
檢查存儲服務器,發現大部分文件只有幾百 KB,而有幾個文件非常大,有數百兆,讀寫這些大文件一次需要幾十秒,這段時間,磁盤基本被這個文件獨占,導致其他用戶的文件操作緩慢。
經驗教訓:
存儲的使用需要根據不同文件類型和用途進行管理,圖片都是小文件,應該使用專用的存儲服務器,不能和大文件共用存儲。批處理用的大文件可以使用其他類型的分布式文件系統。
高并發訪問數據庫引發的故障
故障現象:
某應用發布后,數據庫 Load 居高不下,遠超正常水平,持續報警。
原因分析:
檢查數據庫,發現報警是因為某條 SQL 引起的,這條語句執行頻率很高,遠超正常水平。追查這條 SQL,發現被網站首頁調用。
經驗教訓:
- 首頁不應該訪問數據庫,首頁需要的數據可以從緩存服務器或者搜索引擎服務器獲取。
- 首頁最好是靜態的。
高并發情況下鎖引發的故障
故障現象:
某應用服務器不定時地因為響應超時而報警,但是很快又超時解除,恢復正常,如此反復。
原因分析:
程序中某個單例對象中多處使用了
synchronized(this)
,由于this
對象只有一個,所有的并發請求都要排隊獲得這唯一的一把鎖。一般情況下,都是一些簡單操作,獲得鎖,迅速完成操作,釋放鎖,不會引起線程排隊。但是某個需要遠程調用的操作也被加了synchronized(this)
,這個操作只是偶爾會被執行,但是每次執行都需要較長的時間才能完成,這段時間鎖被占用,所有的用戶線程都要等待,響應超時,這個操作執行完后釋放鎖,其他線程迅速執行,超時解除。
經驗教訓:
使用鎖操作要謹慎。