隨著壓力測試規模放大,客戶端的瓶頸也冒出來了。我遇到的狀況是在接連數次測試過程中,K6 出現 An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full 錯誤,無法繼續對網站建立連線:

依據老司機的經驗,極有可能是同時開啟的大量 TCP 連線耗盡動態 Port。這個測試的 VU 開到 30000 個,出錯當下已建立 11809 個,每個 VU 開啟一條 TCP 連線就要用掉一萬多個動態 Port,若包含先前測試殘留尚未關閉的 TCP 連線 (TIME_WAIT 狀態) 也會佔用一些,的確可能用光所有可用 Port。

事件檢視器有 4231 謷告證實了這點:

Windows 的可用動態 Port 範圍預設為 49152 - 65535,共 16,384 個。要應付 30000 個 VU 同時連線明顯不夠用。參考 BizTalk 效能調校文件的做法,透過 netsh int ipv4 set dynamicport tcp start=1025 num=64511 指令將可用 Port 數提高到 64511 個,問題排除。

另外,有個 Registry HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay 設定 TCP 連線關閉後維持 TIME_WAIT 狀態的時間長度(可節省萬一需要重建連線的耗費成本 參考),預設值為 120s,建議也縮短到 30s。這麼做的代價是萬一過早關閉,重建連線會耗費較多資源,對壓力測試客戶端而言,縮短 TIME_WAIT 時間利大於弊,可減少可用 Port 號佔用讓測試更順暢。

Tips of setting TCP dynamic port range and TIME_WAIT registry to remove limitation when running stress test.


Comments

Be the first to post a comment

Post a comment