超難的SQL Server timed out 和 互鎖衝突 的問題,兩三年才找到原因。

有個服務器,既有數據庫服務器,又有網絡服務器,還有很多定時運行的程序。網絡服務器閒時一個星期出現兩三次SQL Server timed out 問題,忙時每天出現四五次SQL Server timed out問題,有時還經常出現互鎖衝突。小老闆不高興,是程序員出身,但是是那種水平一般般的那種,總覺得是哪個SQL 語句性能太差,把SQL server搞垮了。搞了兩年的SQL語句優化問題,還是沒有解決,真的是很煩,我老覺得不應該是SQL語句性能的問題,因爲找了這麼多年,爛SQL應該都沒了。應該是web 服務器或者其他原因導致了機器過載,然後導致數據庫服務器性能下降,導致SQL Server timed out問題。但是又找不到直接導致的原因,又不想天天去優化那些不該優化的SQL。就這事經常和小老闆經常有衝突。

老闆把服務器內存加大到32G,問題還是出現。

最近發現有個定時運行的程序產生的日誌沒有出現,這個程序有好幾個copy(每個copy有不同的運行參數)每分鐘運行一次,不管成功不成功都要生成一些日誌。這非常蹊蹺,爲什麼沒有日誌呢?

懷疑程序可能根本沒有運行,所以日誌沒有出現。

這個程序由windows 2008服務器的scheduler每分鐘定時運行,查看scheduler的日誌,發現日誌無法查看,新產生的日誌馬上就消失,原因是太多的日誌產生了所以一秒鐘前的日誌因爲後一秒產生的日誌太多而被刪掉了。再看scheduler的設置,發現是“失敗立即重新運行”和“如果有同樣的程序運行就放棄”。

原因出來了,由於網絡服務器很忙時,定時運行的程序由於要處理的東西非常多運行時間比較長,要20分鐘才能完成,結果因爲同樣程序在運行即使輪到它也不能運行。但是失敗了馬上又重新運行,這樣一個週期在一秒鐘內估計反覆幾千次,把CPU資源耗盡了,所以導致無法啓動定時程序,所以也沒有日誌產生。同樣因爲CPU資源耗盡,導致數據庫服務器反應很慢,導致timed out和互鎖衝突。

把scheduler設置改了改,如果失敗每隔一分鐘嘗試一次但是最多運行3次。

SQL Server timed out和互鎖衝突再也沒有出現過。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章