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中也沒有找到相應解釋。只能通過字面含義去解釋。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM