sql server 性能調優之 資源等待之網絡I/O

一.概述 

  與網絡I/O相關的等待的主要是ASYNC_NETWORK_IO,是指當sql server返回數據結果集給客戶端的時候,會先將結果集填充到輸出緩存裏(ouput cache),同時網絡層會開始將輸出緩存裏的數據打包,由客戶端接收。若是客戶端接收數據包慢,sql server沒有地方存放新數據結果時,這時任務進入ASYNC_NETWORK_IO等待狀態。html

  1. 從實例級別查看ASYNC_NETWORK_IOsql

   

   平均耗時: 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)

  監聽到的會話以下:sqlserver

  

  使用dbcc inputbuffer 查詢64結果以下:性能

    

  3.分析與解決優化

    這個等待出現的問題強調如下幾點:spa

    (1) 客戶端沒有把數據及時取走,調整sqlserver 的配置通常狀況下是否是有什麼大的幫助。.net

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

相關文章
相關標籤/搜索