ASP.NET Core進(jìn)程內(nèi)與進(jìn)程外的性能對(duì)比

轉(zhuǎn)自:角落的白板報(bào) cnblogs.com/wer-ltm/p/13637198.html
前言
本文內(nèi)容是《深入去淺出ASP.NET Core》提供的擴(kuò)展內(nèi)容,畢竟在書里說進(jìn)程內(nèi)外的性能說明對(duì)比,對(duì)于初學(xué)者而言,稍微復(fù)雜了點(diǎn)。
我在B站的視頻是基于.NET Core 2.2提供的案例,在書籍中提供的是.NET Core 3.1的案例。有人問,默認(rèn)進(jìn)程到底是進(jìn)程外還是進(jìn)程內(nèi)。
ASP.NET Core 默認(rèn)進(jìn)程
ASP.NET Core 2.2 由默認(rèn)的進(jìn)程外,所以需要我們指定下項(xiàng)目文件中的進(jìn)程信息。
而從ASP.NET Core 3.X開始,dotnet開發(fā)團(tuán)隊(duì)又將它修改為了進(jìn)程內(nèi)。
所以請(qǐng)記?。?/span>
ASP.NET Core 2.X及以前默認(rèn)是進(jìn)程外托管
ASP.NET Core 3.X默認(rèn)為進(jìn)程內(nèi)托管
我最近查詢了下,應(yīng)該說最早.NET Core就不支持進(jìn)程內(nèi),所以也是慢慢迭代到支持進(jìn)程內(nèi)的。
ASP.NET Core的進(jìn)程內(nèi)托管
使用 InProcess 托管,應(yīng)用程序托管在 IIS 工作進(jìn)程(w3wp.exe 或 iisexpress.exe)中。只有一個(gè) Web 服務(wù)器,它是承載我們的應(yīng)用程序的 IIS 服務(wù)器,如圖是進(jìn)程內(nèi)托管圖。

在ASP.NET Core 2.2后,IIS上有了一個(gè)In Process托管模型,該模型直接在IIS應(yīng)用程序池內(nèi)部托管ASP.NET Core,而無需使用代理dotnet.exe運(yùn)行.NET Core本機(jī)Kestrel Web服務(wù)器的外部實(shí)例。
進(jìn)程內(nèi)模型不使用Kestrel,而是使用IISHttpServer()直接在IIS應(yīng)用程序池內(nèi)部托管的新Web服務(wù)器實(shí)現(xiàn),該實(shí)現(xiàn)與傳統(tǒng)的ASP.NET被引入IIS的方式有些相似。

此實(shí)現(xiàn)形式,應(yīng)用會(huì)訪問本機(jī)IIS對(duì)象以建立創(chuàng)建的請(qǐng)求數(shù)據(jù),并將HttpContext其傳遞到ASP.NET Core中間件管道。
當(dāng)然這些都是.NET Core層面的處理,我們作為應(yīng)用開發(fā)者,基本會(huì)去關(guān)心和留意它。
但是就是這個(gè)調(diào)整,大大的提高了ASP.NET Core在IIS上的請(qǐng)求吞吐量。
實(shí)際生產(chǎn)環(huán)境中InProces還是OutOfProcess
對(duì)于部署項(xiàng)目到IIS環(huán)境中,您幾乎肯定希望是采用InProcess模式進(jìn)行托管,因?yàn)樗峁┝烁玫男阅埽⑶彝ǔU加玫馁Y源較少,因?yàn)樗苊饬薎IS和Kestrel之間可能存在的網(wǎng)絡(luò)抖動(dòng)。
但是是其他場(chǎng)景下,我就推薦采用OutOfProcess模式了,比如:
用于故障排除和調(diào)試故障服務(wù)器(例如,您可以在啟用控制臺(tái)日志記錄,查看更加詳細(xì)的信息)。
同一個(gè)應(yīng)用程序?qū)崿F(xiàn)100%兼容,無論是部署在Windows還是Linux上,Kestrel的主要機(jī)制是可以處理所有平臺(tái)上的HTTP請(qǐng)求。
使用InProcess模型時(shí),則不會(huì)使用Kestrel服務(wù)(這個(gè)在我的書中有詳細(xì)說明),而是直接與IIS的請(qǐng)求管道中的模塊進(jìn)行通信。
調(diào)整為進(jìn)程外托管
我們可以通過修改項(xiàng)目文件,配置AspNetCoreHostingModel值以下
<AspNetCoreHostingModel>OutOfProcessAspNetCoreHostingModel >然后就可以調(diào)整為進(jìn)程外托管模式。
關(guān)于更多進(jìn)程內(nèi)和進(jìn)程外的知識(shí),可以查看《深入淺出ASP.NET Core》的5.4章內(nèi)容。
West Wind WebSurge 測(cè)試
我準(zhǔn)備了一個(gè)項(xiàng)目Demo,使用 West Wind WebSurge 軟件來測(cè)試下進(jìn)程內(nèi)與進(jìn)程外項(xiàng)目的吞吐情況。
它還可以檢查服務(wù)器的HTTP響應(yīng),并檢查Web服務(wù)器Kestrel或Microsoft IIS作為Web服務(wù)器:
ASP.NET Core2.X 進(jìn)程外(OutOfProcess)

ASP.NET Core2.X 進(jìn)程內(nèi)(Inprocess)

性能對(duì)比
使用新的In Process模型的明顯原因是它更快,使用的資源更少,因?yàn)樗苯釉贗IS應(yīng)用程序池的過程中運(yùn)行。沒有內(nèi)部HTTP流量和開銷,請(qǐng)求將立即處理。
本次測(cè)試,僅僅是為了對(duì)比進(jìn)程內(nèi)核進(jìn)程外的性能對(duì)比,不作為其他應(yīng)用程序的抗負(fù)載能力的參考。
因?yàn)樵L問的接口很簡單,請(qǐng)求僅表明可以大大提高潛在的吞吐量,但是對(duì)于長流程的請(qǐng)求和請(qǐng)求訪問時(shí)間,應(yīng)用程序處理的開銷也增加,所以理性看待。
尋求高的性能始終是一個(gè)好主意,提供程序的吞吐量意味著更少的請(qǐng)求延遲,更快的響應(yīng)時(shí)間以及更少的服務(wù)器開銷,增加更多的負(fù)載能力。
我準(zhǔn)備了一臺(tái)4核8G的筆記本,因?yàn)檫@臺(tái)筆記本裝了很多其他應(yīng)用,因此產(chǎn)生的結(jié)果肯定不如服務(wù)器的結(jié)果,現(xiàn)在開始進(jìn)行測(cè)試。
進(jìn)程內(nèi)托管模式結(jié)果

上面的進(jìn)程內(nèi)托管模式,我們可以看到一共發(fā)送了3.7W次請(qǐng)求,每秒633次請(qǐng)求的處理速度。
進(jìn)程外托管模式結(jié)果

切換為進(jìn)程外后,一共處理了1.3W次請(qǐng)求,每秒是217次請(qǐng)求處理速度。
可以看到進(jìn)程外的性能比進(jìn)程內(nèi)的較低。
再次說明,因?yàn)槲业腜C機(jī)中安裝了和運(yùn)行了大量的其他應(yīng)用,給予它測(cè)試的內(nèi)存和CPU是不足夠的,感興趣的可以,自己進(jìn)行測(cè)試。
最后
盡管IIS被不停的邊緣化以支持在Linux和Docker上托管,但請(qǐng)記住,如果發(fā)布到
云原生平臺(tái),如Azure的WebAPP或者其他未明確指定的平臺(tái),IIS依然是ASP.NET Core 部署的默認(rèn)模型。
這說明IIS確實(shí)還在很多場(chǎng)景中有廣泛的使用,因此它不會(huì)很快消失。
微軟通過新增的進(jìn)程內(nèi)模型,提供更好的性能處理機(jī)制以此來增加對(duì)它的支持。
現(xiàn)在開始,我們有兩種選擇,
可以使用OutofProcessing(通過IIS代理請(qǐng)求)并使用完全獨(dú)立的ASP.NET Core控制臺(tái)應(yīng)用程序(通過基于.NET的Kestrel Web服務(wù)器使用)托管在IIS上,
也可以使用InProcess托管模型,它與經(jīng)典ASP.NET通過其自身的本機(jī)API與IIS進(jìn)行交互的方式更為相似。
In Process模型在請(qǐng)求吞吐量方面要快得多,因此在幾乎所有情況下,在IIS上托管時(shí),您都希望選擇InProcess模型。
文章參考來源:https://weblog.west-wind.com/posts/2019/Mar/16/ASPNET-Core-Hosting-on-IIS-with-ASPNET-Core-22#check-the-response-server-header
案例源代碼地址:https://github.com/RickStrahl/AspetCoreIISInprocessHostingSample
【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程?★★★
.NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃
【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引
Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)
.NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了
10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼
用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面
在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度
現(xiàn)身說法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化
給我好看
您看此文用
?
?
·
?
秒,轉(zhuǎn)發(fā)只需1秒呦~

好看你就
點(diǎn)點(diǎn)
我

