題 獲取系統缺少足夠的緩衝區空間或因為隊列已滿


我的ASP.NET和SQL Server 2012應用程序在Windows Server 2008 R2上運行。突然,我服務器上的互聯網停止工作,我的應用程序開始投擲,

An operation on a socket could not be performed because the system lacked sufficient buffer 
space or because a queue was full

運行netstat顯示PID = 0打開了很多端口。 Netstat說,

Process Id = 0, State = TIME_WAIT have 130,053 ports open
Process Id = 38840, State = CLOSE_WAIT have 5 ports open
Process Id = Any, State = LISTENING have 30 ports open
Process Id = Any, State = ESTABLISHED have 10 ports open

統計2015年12月22日,

CLOSE_WAIT  5   
ESTABLISHED 146
TIME_WAIT   646750
LAST_ACK    1
LISTENING   30

5
2017-11-20 06:44


起源


問題:(1)內存多少錢? (2)重啟會修復嗎? (3)你在運行torrent下載器嗎? (4)結果是什麼? sfc / scannow? (5)您是否已完成防病毒全面掃描(除了您的防病毒軟件,我建議使用Malwarebytes Anti-Malware)? - harrymc
(6)檢查是否值 TcpTimedWaitDelay的 需要減少。 (7)您是否安裝了任何接收或啟動大量TCP連接的產品,例如Web服務器? - harrymc
@harrymc 1)RAM為8 GB,但數據庫消耗了近5 GB。 2)是的我認為但這是生產網站我做不到3)否4)我正在運行Windows服務器5)否(我正在使用Rackspace服務器,假設維護這個) - user960567
@harrymc 6)我已將此設置為30秒7)是的我在這裡使用ASP.NET,這意味著IIS Web服務器。服務器上的一些cron作業也會啟動HTTP(意味著TC​​P)連接。 - user960567
更多:(1)如果您已設置TcpTimedWaitDelay並重新啟動,這有幫助嗎? (2)Web服務器是否滿載請求(發布一些統計信息)? (3)它是服務本地主機還是網絡請求? (4)您可以發布Machine.config文件或至少發布其connectionManagement部分(請參閱 本文)? - harrymc


答案:


您正在運行由多個移動設備的瀏覽器訪問的Web服務器。

由於TCP / IP的工作方式,無​​法立即關閉連接。在連接關閉後,數據包可能無序到達或重新傳輸。 CLOSE_WAIT表示遠程端點(連接的另一端)已關閉連接。 TIME_WAIT表示本地端點(此端)已關閉連接。保持連接,以便任何延遲的數據包可以與連接匹配並進行適當處理。在默認的四分鐘時間內,連接將被刪除。

儘管如此,TIME_WAIT統計信息旁邊的數字646750非常過分。 這意味著在過去的4分鐘內關閉了646750個連接,這使得每秒2694個! 顯然,其中一些移動設備出現嚴重故障並正在轟炸您的服務器 沒有從客戶端正確關閉的連接,或者您正在服務的連接 大量的客戶端(這對單個服務器沒有意義)。

如果您無法隔離哪些移動設備或應用程序 是問題的原因並解決它們, 你不控制客戶端,只能緩解服務器端的問題。

可以改善這種擁塞的一個參數是 TcpTimedWaitDelay的, 被描述成:

確定TCP釋放關閉之前必須經過的時間   連接並重用其資源。這個間隔關閉和   release稱為TIME_WAIT狀態或2MSL狀態。在這   時間,連接可以以更低的成本重新打開客戶端   和服務器建立新連接。

減少此條目的值允許TCP釋放關閉   連接速度更快,為新連接提供更多資源。   但是,如果該值太低,TCP可能會釋放連接   連接完成之前的資源,需要服務器   使用其他資源重新建立連接。

可以通過regedit修改TcpTimedWaitDelay HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters。 它包含等待的秒數。默認值為240秒(4分鐘)。 如果更改,則需要重新啟動。

例如,更改為30秒並且每秒2694個連接將僅表示 80820連接將等待關閉。 此數字仍然很大,但更改仍將減少連接資源的使用。


7
2018-01-24 12:44



謝謝你的詳細解答。我仍在尋找根本原因。 - user960567
我找不到 TcpTimedWaitDelay 在註冊表中。我應該創造它嗎? Windows是2008 R2 Enterprise。 - Saeed Neamati
@SaeedNeamati:是的(DWORD)。 - harrymc


同樣的問題: https://serverfault.com/questions/661476/getting-an-operation-on-a-socket-could-not-be-performed-because-the-system-lack/

它是一個windows max連接問題,有些kb說更改最大臨時端口或添加內存:/

http://blogs.msdn.com/b/sql_protocols/archive/2009/03/09/understanding-the-error-an-operation-on-a-socket-could-not-be-performed-because-the-系統缺乏充足緩衝 - 空間 - 或因為-A-隊列是-full.aspx

我在物理服務器上看到了這個問題,正常運行時間非常長(8個月以上),重新啟動解決了問題...


-1
2018-01-22 12:55



Server 2008 R2上已修復了最大臨時端口。 - harrymc
你的短暫端口上的配置是什麼?你可以用這樣的腳本檢查%max used port blogs.msdn.com/b/debuggingtoolbox/archive/2010/10/11/... - YuKYuK
看到 短暫的港口限制。 - harrymc
你的netstats顯示:Process Id = 0, State = TIME_WAIT have 130,053 ports open  130k連接有點高,檢查這個過程他會破壞你的連接。 - YuKYuK
是的,我知道但人們說TIME_WAIT不是問題,它會自動重置 - user960567