前言

最近這幾週的工作內容就是不斷對 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
Quque Length


2. 登錄檔 (regedit)

修改Windows Service 登錄檔,將連接埠使用數量提高,降低連線等待時間,藉此讓連線效率提升,讓伺服器能承受更大的壓力。

路徑為:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters

所需要增加的參數為
MaxUserPort : 對外連線使用的連接埠數量,我們設定 65000
TcpTimedWaitDelay : TIME_WAIT 時間,我們設定 30
若開啟沒有這兩個檔案,可以自行手動新增 (類型:DWORD Value)
Step 1. 右鍵 > New > DWORD Value
Right clck  > New > DWORD Value

Step 2. TcpTimedWaitDelay 設定 Value 為 30,注意右邊要選擇 Decimal (10進位)
Set TcpTimedWaitDelay to 30

Step 3. MaxUserPorts 設定為 65000,注意右邊要選擇 Decimal (10進位)
Set MaxUserProts to 65000

Step 4. 重開機 (restart your windows server)
註:在自己的測試案例中,雖然 port數設定為65000,但壓力測試過程中,伺服器連線數量最大約到3000左右。


3. 移除不需要的 module 

因為本身測試環境為WebAPI,可將許多IIS預設載入的模組進行移除。我們能在各別站台的Web.Config 檔案進行設定。在移除過程中請參考自己的網站/服務是否需要這些模組。

Step 1. 開啟 IIS -> 選擇站台 -> 選擇模組
找到模組

Step 2. 我們可以移除模組類型為 managed 的模組
我們預計測試移除的模組

Step 3. 我們對該模組點選右鍵,選擇移除
移除模組

Step 4.在web.config 上可以看見移除模組 (從web.config編輯也有相同效果)
移除後的web.config
註:在自己的測試案例中,效果並不顯著。


4. Disable SessionState 

Step 1. 在 IIS 站台,選擇 Sesseion State
site > Session State

Step 2. 選擇未啟用 > 套用
Not enabled then apply

若沒有使用SessionState的情況下,我們也能嘗試關閉他增加效能:在 Web.config 檔案<system.web>內加入SessionState = off ,如:
      
    
    
     

註:在自己的測試案例中,效果並不顯著。


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 格式的資料,故加入:
  


註1:在自己的測試案例中,原先已經開啟,效果不詳。
註2:壓縮不一定增加效能,可能增加CPU使用而導致sever整體效能低落。
註3:在自己的受測案例中,WebAPI回傳資料不大,效果似乎不大。


6. Disable debug mode

Step 1. 在 web.config 內 system.web 內設定,如下
 
  
    
    
  

Step 2. 儲存後將會自動啟動應用程式
註:在自己的測試案例中,原先已經開啟,效果不詳。


7.  Max worker processor (工作處理序數上限)

Step 1. 選擇應用程式集區 > 選擇應用程式 > 進階設定



Step 2.  將 Maximum worker processes 調整成 2,點選OK。
update Maximum worker processes

註:在自己的測試案例中,效果不佳。
註:若你有使用session,可能會造成影響。


相關系列文章:JMeter 系列文章

參考資料

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