Posts

Showing posts from July, 2016

[SQL Server] 解決不斷出現 ASYNC_NETWORK_IO 導致TimeOut的問題

Image
病徵:

公司在VMware上的SQL Server最近不斷出現大量的ASYNC_NETWORK_IO錯誤,而且有時候會出現TimeOut的情況。檢查RAM, CPU, IO皆正常沒有異常的情況。

研究:
拜了一下Google大神,如果硬體自我感覺良好,不外乎也是幾個原因[1][2]:

回傳過大的查詢結果。Database網路卡設定有問題,回傳速度很慢。Client端跟Database 端的網路連結出現問題。Linked Server等待遠端資料表的回應。第一個原因可以在Activity monitor裡面Process這一欄找一下出現Error的Process SQL Statement是什麼。小弟發現出現ASYNC_NETWORK_IO的SQL查詢100%來自一個資料表,這個資料表有60萬筆的數據、沒有Primary Key、而且每次回傳也要做Ordering,使用CPU是Top Ten,不過還沒嚴重到影響資料庫的效能。
發現問題的時候打開了效能檢示器,傳輸的量沒有達到網路卡的最大值。跟infra team討論後VMware的實體網路卡也是正常,暫時排除這個可能。
隨機取樣一些出現這個情況的user打電話問看看,沒有發現網路不正常的情況,暫時排除這個可能。
這個資料表不是Linked Server,所以也排除掉。暫時得出的結論
直像告訴我好像是第一個原因比較像。
解決方法 由於還不能100%保證病因,所以今天小弟做了兩件事: 跟programmer溝通一下,發現這些查詢是Delphi 內部的 Data engine產生,所以programmer無法刪除這種回傳全部Data還要Ordering的百痴沒用查詢,也由於這個資料表是公司內部很多系統的log table,因此I/O很高,也無法減少存取次數。
所以最後我把資料表的資料量盡量壓縮,縮成只儲存一個星期,每天把剩下的自動備份到另一個資料表去。看看情況有沒有改善。
加入Cluster Index,不能改SQL至少也讓它快一些。暫時還不太清楚是否有效,過一陣子小弟會在這裡再更新。


reference:
[1] Troubleshooting ASYNC_NETWORK_IO, NETWORKIO
https://blogs.msdn.microsoft.com/joesack/2009/01/08/troubleshooting-asy…