[IIS] Performance tunning for WebAPI

  • 5072
  • 0
  • 2017-05-19

前言

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

所需要增加的參數為

MaxUserPorts 對外連線使用的連接埠數量,我們設定 65000
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)

註:在自己的測試案例中,雖然 port數設定為65000,但壓力測試過程中,伺服器連線數量最大約到3000左右。

 

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" />

註1:在自己的測試案例中,原先已經開啟,效果不詳。
註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