前言
最近這幾週的工作內容就是不斷對 WebAPI 進行壓力測試。與過去最大不同的是,這次有強大硬體設備讓我做更嚴格測試案例。這篇文章簡單紀錄整個測試過程,但並非所有調整都有顯著效能提升,這裡僅作為個人筆記與提供有興趣的人參考。
測試與紀錄
1. Queue Length
IIS 會限制 application pool requests 最大值,若超過這個數值,使用者會收到 503 - Service Unavailable 錯誤訊息,Queue length 預設值為1000。官方建議值應為使用者 x 1.5 ,若使用者為2000人,Queue length 應為 3000。
設定位置在 IIS 內 Application pools > Advanced Settings... > Queue length
2. 登錄檔 (regedit)
修改Windows Service 登錄檔,將連接埠使用數量提高,降低連線等待時間,藉此讓連線效率提升,讓伺服器能承受更大的壓力。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters
所需要增加的參數為
TcpTimedWaitDelay : TIME_WAIT 時間,我們設定 30
若開啟沒有這兩個檔案,可以自行手動新增 (類型:DWORD Value)
Step 1. 右鍵 > New > DWORD Value
Step 2. TcpTimedWaitDelay 設定 Value 為 30,注意右邊要選擇 Decimal (10進位)
Step 3. MaxUserPorts 設定為 65000,注意右邊要選擇 Decimal (10進位)
Step 4. 重開機 (restart your windows server)
3. 移除不需要的 module
因為本身測試環境為WebAPI,可將許多IIS預設載入的模組進行移除。我們能在各別站台的Web.Config 檔案進行設定。在移除過程中請參考自己的網站/服務是否需要這些模組。
Step 1. 開啟 IIS -> 選擇站台 -> 選擇模組
Step 2. 我們可以移除模組類型為 managed 的模組
Step 3. 我們對該模組點選右鍵,選擇移除
Step 4.在web.config 上可以看見移除模組 (從web.config編輯也有相同效果)
4. 關閉 SessionState
Step 1. 在 IIS 站台,選擇 Sesseion State
Step 2. 選擇未啟用 > 套用
若沒有使用SessionState的情況下,我們也能嘗試關閉他增加效能:在 Web.config 檔案內加入SessionState = off ,如:
<configuration>
<system.web>
<sessionState mode="Off"></sessionState>
</system.web>
</configuration>
5. HTTP Compression
Step 1. 點選站台 > 壓縮 (Compress)
Step 2. 勾選啟用動態內容壓縮 (Check Enable dynamic content compression)
Step 3 壓縮設定:您可以在web.config內直接加入<httpcompression> 標籤並進行設定;您也可以設定在 ApplicationHost.config (位於 %windir%\System32\inetsrv\config),如下圖所示,因為我們 WebAPI 回傳為 json 格式的資料,故加入:
<add enabled="true" mimetype="application/json" />
註2:壓縮不一定增加效能,可能增加CPU使用而導致sever整體效能低落。
註3:在自己的受測案例中,WebAPI回傳資料不大,效果似乎不大。
6. Disable debug mode
Step 1. 在 web.config 內 system.web 內設定,如下
<configuration>
<system.web>
<compilation debug="false" targetframework="4.5"></compilation>
</system.web>
</configuration>
Step 2. 儲存後將會自動啟動應用程式
7. Max worker processor (工作處理序數上限)
Step 1. 選擇應用程式集區 > 選擇應用程式 > 進階設定
Step 2. 將 Maximum worker processes 調整成 2,點選OK。
註:若你有使用session,可能會造成影響。
後記
很久沒在點部落上發文了(最近寫的與技術無關... :) ),熊熊發現編輯器好好用,各種注意、警告的樣式美觀又實用。
參考資料
1. https://technet.microsoft.com/en-us/library/cc753681(v=ws.10).aspx
2. Avoiding TCP/IP Port Exhaustion
3. 在 Windows 上遇到非常多 TIME_WAIT 連線時應如何處理 - The Will Will Web
4. Modifying the IIS Queue Length
5. Improving ASP.NET Performance Part 11: Session State Management
6. ASP.NET Performance Overview
7. Built-in GZip/Deflate Compression on IIS 7.x