ASP.NET Core 8 在 Windows 上各種部署模型的性能測試

ASP.NET Core 8 在 Windows 上各種部署模型的性能測試

我們知道 Asp.net Core 在 windows 服務器上部署的方案有 4 種之多。這些部署方案對性能的影響一直以來都是靠經驗。比如如果是部署在 IIS 下,那麼 In Process 會比 Out Process 快;如果是 Self Host 那麼使用 HttpSys 服務器會比 Kestrel 快。
那麼真實結果是否如我們想象的那樣呢?接下來就讓我們來做一次 benchmarks 吧。

託管模型

在開始 benchmark 測試之前,我們再來來介紹一下這 4 種託管模型:

1. InProcess 模式

InProcess 模式將 ASP.NET Core 應用程序直接部署在 IIS 中,與 IIS 工作進程相同的進程中運行。理論上,這種模式的性能應該相對較高,因爲請求無需經過額外的進程通信。

2. OutProcess 模式

OutProcess 模式下,ASP.NET Core 應用程序在獨立於 IIS 工作進程的進程中運行。這種模式通過進程間通信與 IIS 進行通信,理論上可能引入一些性能開銷。

3. SelfHost HttpSys 模式

HttpSys 模式是一種自承載方式,利用 Windows 操作系統內核級的 HTTP 服務器。通常認爲在處理大量併發連接時具有優勢,因爲它與操作系統集成。

4. SelfHost Kestrel 模式

Kestrel 模式是 ASP.NET Core 的內置 Web 服務器,可以獨立運行而無需依賴其他外部服務器。Kestrel 是輕量級、跨平臺的選擇,專爲處理大量併發連接而設計。

壓測平臺

  • 操作系統: Windows Server 2012 R2 Datacenter
  • 硬件配置: Intel E3 1260L CPU, 16GB 內存
  • 網絡: 家庭內網,TP-LINK 家用 1000M 交換機

因爲本人沒啥高性能的服務器,家裏只有一臺老舊的 HP Gen8 服務器。安裝 windows server 2012 R2 datacenter,CPU 爲 E3 1260L。E3 同樣是古董,大概是 intel 10年前的產品。內存爲 16G 1333 服務器專用內存。
整個測試平臺可以說是相當拉跨。湊合用用吧,反正不是彪極限性能,橫向對比的話問題不大。

壓測過程

新建一個 ASP.NET Core 默認項目。採用 VS2022 自帶的模板,使用 miniapi 對 '/' 路徑直接輸出 'Hello World!' 字符串。

using System.Diagnostics;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

var app = builder.Build();

// Configure the HTTP request pipeline.

app.MapGet("/", () =>
{
    return "Hello World!";
});

app.Run();

如果使用 HttpSys 服務器則多加一行代碼:

builder.WebHost.UseHttpSys();
  • 測試工具: 使用 Netling 進行壓力測試,模擬真實用戶請求。
  • 測試流程: 在對每個場景進行測試前先進行 60s 的預熱,等待大概 10s 再後進行 4 次持續的壓力測試(8個線程,持續30s),記錄結果(RPS)。

Benchmark 測試結果

以下是測試結果:

託管模型 Requests Per Second (RPS)
InProcess 7266
OutProcess 7960
SelfHost HttpSys 26300
SelfHost Kestrel 27199

性能分析與總結

測試結果大大的出乎了我的預料,特別是 OutProcess 模式的性能略高於 InProcess 模式,與我的認知出現了比較大的偏差。同時,SelfHost Kestrel 模式的性能優於 SelfHost HttpSys 模式,這也與一般的預期不同,因爲 HttpSys 是運行在內核態的服務器。

這樣的差異可能受多種因素影響,包括硬件配置、操作系統版本、IIS的版本等,畢竟這些產品都是10年前的產物,而 ASP.NET Core8 是 2023 年的全新產品。測試結果受到多種因素的影響,大家不要較真,就圖一樂吧。

不過從結果上橫向來看,至少可以得出以下結論:

  • Self Host 比 IIS Host 性能上要快上好幾倍。在追求極限性能的場景,應該選擇 Self Host。
  • IIS Host 不管是 In Process 還是 Out Process 性能也不差。就測試平臺這種老古董也能跑個 7000+ RPS。這還不是極限,因爲 7000 RPS 的時候 CPU 纔到 50%+ 。如果我再多加一些線程,相信輕鬆可以過萬。
  • 以上最差的結果也有 7000 多的 RPS。這表明對於一般的信息系統而言,ASP.NET Core 本身的性能一般不會是瓶頸。瓶頸最早出現一定是在其他 IO 模塊,比如數據庫。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章