原文: sql server 性能調優 資源等待之網絡I/O
一.概述
與網絡I/O相關的等待的主要是ASYNC_NETWORK_IO,是指當sql server傳回資料結果集給用戶端的時候,會先将結果集填充到輸出緩存裡(ouput cache),同時網絡層會開始将輸出緩存裡的資料打包,由用戶端接收。如果用戶端接收資料包慢,sql server沒有地方存放新資料結果時,這時任務進入ASYNC_NETWORK_IO等待狀态。
1. 從執行個體級别檢視ASYNC_NETWORK_IO

平均耗時: 46366950.0/43014737.0=1.077ms, 最大等待時間:~40秒。
2. 重制ASYNC_NETWORK_IO等待
為了示範ASYNC_NETWORK_IO 現象,我們需要輸出一個大結果集。當sql server記憶體完全被使用後,大量的資料填充到緩存裡,此時sql server沒有地方存放新資料結果,進入等待狀态。
-- 一次查詢100000條資料輸出到用戶端
SELECT TOP 100000 * FROM PUB_Stock WITH(nolock)
監聽到的會話如下:
使用dbcc inputbuffer 查詢64結果如下:
3.分析與解決
這個等待出現的問題強調以下幾點:
(1) 用戶端沒有把資料及時取走,調整sqlserver 的配置一般情況下是不是有什麼大的幫助。
(2) 網絡層可能是問題的原因。 解決:1是減少對用戶端大量資料輸出。 2是加大sqlserver 的network packe size,從一定程度上優化網絡轉輸的性能,但會增加記憶體的開銷(建議小于設定小于8kb)。
network packe size是用戶端與sqlserver通信的每個資料包大小有關系。network packe size設定的資料包存放于記憶體功能元件的connection類别裡。預設是4kb設定,輸入輸出緩存會放在buffer pool裡,如果改成了8kb 或更大,輸入輸出緩存會放在multi-page裡 關于記憶體可檢視
sql server 記憶體初探。 設定network packe size 可以由sp_configure控制。用戶端應用程式可以覆寫此值如在.net 裡配置如下。
Data Source=(local);Initial Catalog=AdventureWorks;"Integrated Security=SSPI;Packet Size=512
示範将 net work packe size設定成6050位元組
USE AdventureWorks2012 ;
GO
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE ;
GO
EXEC sp_configure 'network packet size', 6500 ;
GO
RECONFIGURE;
GO
也可以能過界面來配置
(3) 應用程式端性能問題,也會導緻sql server裡的ASYNC_NETWORK_IO等待。
sqlserver 的網絡層将結果集打包好發向用戶端以後,要等到用戶端确認收到,才會接着發下一個包。
(4) 分布式鎖
如果長時間看到ASYNC_NETWORK_IO,同時在sqlserver内部又造成了阻塞,并且該等待持續了很久,就該懷疑是否是分布式的死鎖。
總結:當遇到ASYNC_NETWORK_IO等待,需要檢查應用程式自己的健康狀況,也要檢查應用是否有必要向sql server 申請這麼大的結果集傳回,一般來講sqlserver 本身沒有什麼問題。
二. 其它網絡I/O等待
這裡還有其它幾個NET_WAITFOR_PACKET,PROXY_NETWORK_IO,EXTERNAL_SCRIPT_NETWORK_IOF。
2.1 NET_WAITFOR_PACKET: 在msdn中解釋是 網絡讀取過程中,連接配接正在等待網絡資料包時出現。
實際級等待如下圖所示:
2.2 後面二個proxy_network_io,external_script_network_iof。在生産環境下沒有資料。在msdn中也沒有找到相應解釋。隻能通過字面含義去解釋。