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