ASP.NET Core 5 在IIS,Nginx,Caddy下的性能测试
點擊上方藍字關注“汪宇杰博客”
導語
ASP.NET Core 從 2.2 版本起,在 IIS 下可以使用 InProcess 模式提高性能,國外大神 Rick Strahl 對此有一片詳細的文章。3年過去了,現(xiàn)在 ASP.NET Core 已經(jīng)到了 5.0 版本,不同服務器之間的性能有什么變化呢?我們來一起看一下吧。
曾經(jīng)的結論
Rick Strahl 在 原文* 中測試了 Windows 下 ASP.NET Core 2.2 在 Kestrel、IIS InProcess、IIS Out of Process 中的性能,metric 為 request per second。結論是 IIS InProcess > Kestrel > IIS Out of Process。測試方法、工具和結論可以查看 Rick 的文章:
* https://weblog.west-wind.com/posts/2019/Mar/16/ASPNET-Core-Hosting-on-IIS-with-ASPNET-Core-22
今天的實驗
Rick 沒有測試相同配置的 Linux 服務器跑 ASP.NET Core 與 Windows 服務器的區(qū)別。很多朋友想知道,在 2021年跑 ASP.NET Core 5.0 到底用 Windows 還是 Linux 性能好,因此我決定用類似的方法在相同配置的服務器上重新跑一下 ASP.NET Core 5.0 在 Windows 及 Linux 上的 Request per Second 數(shù)據(jù),方便大家參考。
測試環(huán)境
由于 Windows 10、Ubuntu Desktop 等桌面版系統(tǒng)并不能真實代表服務器環(huán)境,因此我均選擇服務器版系統(tǒng)進行測試。所有系統(tǒng)均為全新安裝,并打了最新 patch,并且均多喝了熱水,并重啟試試了一次。
Windows 服務器
供應商:Microsoft Azure 國際版 East Asia 數(shù)據(jù)中心
系統(tǒng):Windows Server 2019
配置:2 vCPU, 4GB RAM, Premium SSD
安裝環(huán)境:IIS (啟用靜態(tài)、動態(tài)壓縮,不含 ASP.NET 3.5, 4.X),ASP.NET Core Runtime 5.0.2
Linux 服務器
供應商:Microsoft Azure 國際版 East Asia 數(shù)據(jù)中心
系統(tǒng):Ubuntu Server 20.04 LTS
配置:2 vCPU, 4GB RAM, Premium SSD
安裝環(huán)境:啟用BBR,安裝?Nginx,Caddy,ASP.NET Core Runtime 5.0.2
測試工具
Rick 使用的是他自主研發(fā)的 West Wind Web Surge,但是這個工具只有 Windows 平臺,沒法滿足我們的需求,因此我使用了一個開源、跨平臺的測試工具?bombardier,該工具也曾經(jīng)在微軟官方 .NET 博客上有所用到。
版本:v1.2.5
下載地址:https://github.com/codesenberg/bombardier
測試工程
一個新建的 ASP.NET Core 5.0 Web API 項目,唯一的方法是:
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
? ? [HttpGet]
? ? public string Get()
? ? {
? ? ? ? return $"Test {DateTime.UtcNow}";
? ? }
}
為了簡單,本次我不測試 Json 序列化等操作,有興趣的朋友可以自行實驗。
該工程使用 Release 編譯,FDD發(fā)布,日志配置留默認,即:
"LogLevel": {
? "Default": "Information",
? "Microsoft": "Warning",
? "Microsoft.Hosting.Lifetime": "Information"
}
測試方法
分別使用 Kestrel、IIS In Process、IIS Out of Process、Nginx 反代、Caddy 反代運行測試工程,隨后使用 bombardier 訪問服務器本機的測試地址,啟用2個連接,10秒鐘DPS,預熱一輪后連續(xù)跑3輪,取 Request per Second 平均值。
注意,在理想環(huán)境下,最好不要使用性能測試工具測試localhost地址,因為操作系統(tǒng)本身分配調(diào)度測試工具和Web服務器之間網(wǎng)絡資源會有一定的影響。但是由于云端的網(wǎng)絡大家都懂的,所以為了盡可能排除網(wǎng)絡影響,我不得不訪問localhost測試。
測試結果
Windows + Kestrel
RPS 平均值:18808
Windows + IIS In Process
RPS 平均值:10089
Windows + IIS Out of Process
RPS 平均值:2820
Linux + Kestrel
RPS 平均值:10667
Linux + Nginx
RPS 平均值:3509
Linux + Caddy
RPS 平均值:3485
結論
測試結果排名(從快到慢):
Windows + Kestrel (18808)
Linux + Kestrel (10667)
Windows + IIS In Process (10089)
Linux + Nginx (3509)
Linux + Caddy (3485)
Windows + IIS Out of Process (2820)
結果和 Rick 當年對 ASP.NET Core 2.2 的測試有所不同。Rick 的測試中,IIS In Process 的性能竟然能超越 Kestrel,他曾經(jīng)表示意外。今天 IIS In Process 還是被 Kestrel 吊打了,這好像還挺合理的。
但是我沒想到的是,同樣用 Kestrel,Windows 服務器的性能竟然能吊打 Linux,我表示意外,畢竟說好的 Windows 性能差,說句政治正確的話,這一定不是 Linux 的問題,很可能是 ASP.NET Core Runtime 對于 Linux 的優(yōu)化沒有 Windows 版的好。
在反代模式下,Nginx 和 Caddy 的性能基本相同,并且都能吊打 IIS Out of Process,這非常政治正確,畢竟說好的 IIS 性能差。
當然了,光一個輸出字符串的測試,并不能代表 ASP.NET Core 5.0 及各服務器性能表現(xiàn)的全部,在實際項目中,影響性能的因素非常多。本次實驗的設計并不覆蓋所有場景,肯定有所紕漏,歡迎大家留言指出。
汪宇杰博客
Azure | .NET |?微軟 MVP
無廣告,不賣課,做純粹的技術公眾號
喜歡本篇內(nèi)容請點個在看
總結
以上是生活随笔為你收集整理的ASP.NET Core 5 在IIS,Nginx,Caddy下的性能测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存缓存MemoryCache
- 下一篇: 【分享】C# 字节帮助类 ByteHel