2011-03-03 44 views
13

對我的Web服務器和數據庫服務器之間的流量進行TCP分析時,我發現網絡緩衝區(TCP窗口)經常被填滿。 Web服務器然後發送TCP消息到數據庫服務器,告訴它它的緩衝區已滿並且在給定更新之前不發送更多的數據。加快IIS/.NET/LINQ從網絡緩衝區檢索數據的速度

例如,這是字節網絡緩衝區的用於越長壽命到數據庫服務器連接中的一個的大小隨時間:

Network Buffer Graph

web服務器運行的.NET 4.0應用程序在Windows 2008 R2 Web服務器上以IIS集成模式運行。 SQL服務器是2008 R2服務器。

我的解釋是,SQL服務器將數據更快地返回到Web服務器,然後Web服務器上的應用程序可以從緩衝區收集數據。我嘗試過調整網絡驅動程序中的所有內容來解決此問題。特別是增加RSS隊列,禁用中斷審覈以及設置Windows 2008 R2服務器以更積極地增加緩衝區大小。

所以,如果我的理解是正確的,讓我想了解一下兩種可能性:

  1. 是否有.NET沒有辦法告訴它來增加網絡緩衝區的大小? 「增強的2008 R2 TCP堆棧」很少決定爲此連接啓用窗口縮放(使緩衝區大於65 kB)(可能是由於延遲較低)。它看起來像手動設置這個系統範圍的能力在Windows Server 2008 r2中沒有了(以前是註冊表項,現在被忽略了)。那麼有沒有一種方法可以在代碼中強制執行?
  2. 是否有任何可以調整的方法來加快應用程序讀取網絡緩衝區信息的速度,特別是SQL連接的速度?

編輯:
要求DMV查詢切斷在ASYNC_NETWORK_IO:

SELECT * FROM sys.dm_os_wait_stats ORDER BY waiting_tasks_count desc; 
 
wait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_ms 
CXPACKET   1436226309 2772827343    39259   354295135 
SLEEP_TASK   231661274  337253925    10808   71665032 
LATCH_EX    214958564  894509148    11855   84816450 
SOS_SCHEDULER_YIELD 176997645  227440530    2997   227332659 
ASYNC_NETWORK_IO  112914243  84132232    16707   16250951 
+2

這是我將談論微軟的一個問題直接上。打開支持服務單或使用免費的MSDN電話(如果有的話)。 – 2011-03-03 12:54:52

+0

凱爾的後續行動:http://blog.serverfault.com/post/views-of-the-same-problem-network-admin-dba-and-developer/ – 2011-03-20 19:52:19

回答

11

1)是什麼讓你認爲這是TCP流量控制,而不是到SQL Server不產數據在沒有流量的時間間隔內?檢查sys.dm_exec_requests是否看wait_type。等待類型在Waits and Queues中描述。如果確實是應用TCP流量控制的客戶端,那麼您將看到等待類型ASYNC_NETWORK_IO

2)如果的問題確實是網絡等待類型,那麼解決的辦法不是增加帶寬,而是顯然要減少流量。客戶端沒有業務請求來自服務器的太多數據以導致TCP流量控制。這可能是由於在客戶端做了可怕的錯誤事件,比如計數行或客戶端分頁。移動服務器上的處理,只需要獲取所需數據的小結果集。

編輯

消費數據庫調用結果最終定歸結爲某種形式的這樣:

FetchNextRow 
while (not EnfOfResults) 
{ 
    ProcessRow; 
    FetchNextRow; 
} 

什麼,這可能意味着,在現實條件,也可能是foreach row in IQueryableSqlDataReader.Read() 。但基本的想法是一樣的,客戶端從結果中獲取行,處理它們,然後獲取更多的行。如果客戶端代碼的中有,那麼ProcessRow會阻塞,那麼客戶端代碼將不會到達它再次獲取下一行的位置,從而最終將觸發TCP流量控制,從而導致SQL Server暫停查詢(因爲它沒有地方把結果寫入)。在TCP方面你沒有辦法做到這一點。實際上,增加窗口大小實際上可能會使主機變得更糟,因爲現在所有先前在源(DB)處被抑制的結果都將被創建並且必須存儲在某處,這最終意味着分配給存儲器的實時內存並可能使事情變得更糟比現在更糟糕。

如果我現在在你的鞋子裏,我會專注於識別,其中確實會阻止ProcessRow發生阻塞。我提出的一個假設是,處理將是一個MVC視圖寫入響應緩衝區,並被用戶代理不使用HTTP響應導致的TCP流量控制輪流阻止(例如,Ajax調用已完成,但瀏覽器未運行由於主線程正在忙於其他事務,因此消耗響應的完成代碼)。一如既往,最好的方法是有條不紊地衡量。一些可能的工具:

+0

RE 1)爲什麼TCP流量控制?我看到很多從Web服務器到SQL服務器的「零窗口消息」(每個Web服務器每分鐘大約500個)。我也經常看到緩衝區在〜200-300字節左右徘徊。所以我想這是窗口接近於零的時間刻度。然而,當它達到零時,窗口更新非常快(2-3MS)。我現在去看看等待的DMV現在... – 2011-03-03 01:18:28

+0

更新我的問題,包括DMV查詢。 ASYNC_NETWORK_IO正在顯示,但如果這比應該更高,我有點無知。想要查看我的「SQL Server 2008內部」新副本,看看我是否無法學習如何深入瞭解導致此問題的查詢。 – 2011-03-03 01:32:08

+0

最大等待時間16707 ms意味着至少有一項任務需要等待+16秒才能釋放網絡,這將證實您的初步結論。但是這也表明應用程序執行了一個DB請求,然後在讀取結果(空閒緩衝區)的時間長達16秒時沒有任何麻煩。鑑於這是ASP,需要研究的一件事是用戶代理擁塞是否可以阻止您的IIS/ASP緩衝區,這會導致您的ASP線程等待輸出緩衝區,從而使其忽略數據庫請求。 – 2011-03-03 01:37:44