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

病徵:

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

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

  • 回傳過大的查詢結果。
  • Database網路卡設定有問題,回傳速度很慢。
  • Client端跟Database 端的網路連結出現問題。
  • Linked Server等待遠端資料表的回應。
  1. 第一個原因可以在Activity monitor裡面Process這一欄找一下出現Error的Process SQL Statement是什麼。小弟發現出現ASYNC_NETWORK_IO的SQL查詢100%來自一個資料表,這個資料表有60萬筆的數據、沒有Primary Key、而且每次回傳也要做Ordering,使用CPU是Top Ten,不過還沒嚴重到影響資料庫的效能。
  2. 發現問題的時候打開了效能檢示器,傳輸的量沒有達到網路卡的最大值。跟infra team討論後VMware的實體網路卡也是正常,暫時排除這個可能。
  3. 隨機取樣一些出現這個情況的user打電話問看看,沒有發現網路不正常的情況,暫時排除這個可能。
  4. 這個資料表不是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-async_network_io-networkio/

[2] Suspended status in SQL Activity Monitor
http://stackoverflow.com/questions/1330109/suspended-status-in-sql-activity-monitor



Popular posts from this blog

[SQL SERVER] 找出LOCK方法懶人包

[SQL Server] 解決log檔(ldf file)過度膨脹的實戰經驗

[開箱] Dell P2415Q 4K螢幕開箱