亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

相對于正確配置的同步模型,異步模型真的能提高吞吐量嗎?

相對于正確配置的同步模型,異步模型真的能提高吞吐量嗎?

C#
慕尼黑8549860 2022-12-24 15:01:48
每個人都知道異步可以為您提供“更好的吞吐量”、“可擴展性”以及在資源消耗方面更高效。在進行下面的實驗之前,我也想到了這種(簡單的)方式。它基本上告訴我們,如果我們考慮異步代碼的所有開銷并將其與正確配置的同步代碼進行比較,它幾乎不會產生性能/吞吐量/資源消耗優勢。問題:與正確配置線程池的同步代碼相比,異步代碼實際上執行得更好嗎?可能是我的性能測試以某種戲劇性的方式存在缺陷?測試設置:兩個 ASP.NET Web API 方法,JMeter 試圖用 200 個線程線程組調用它們(30 秒恢復時間)。[HttpGet][Route("async")]public async Task<string> AsyncTest(){    await Task.Delay(_delayMs);    return "ok";}[HttpGet][Route("sync")]public string SyncTest(){    Thread.Sleep(_delayMs);    return "ok";}這是響應時間(對數刻度)。請注意,當線程池注入足夠多的線程時,同步代碼如何變得更快。如果我們事先(通過SetMinThreads)設置線程池,它會從一開始就表現出色async。你會問資源消耗怎么樣?!熬€程在 CPU 時間調度、上下文切換和 RAM 占用方面的成本很高”。沒那么快。線程調度和上下文切換是高效的。就堆棧使用而言,線程不會立即消耗 RAM,而只是保留虛擬地址空間并僅提交實際需要的一小部分。讓我們看看數據怎么說。即使線程數量更多,同步版本的內存占用也更?。ㄓ成涞轿锢韮却娴墓ぷ骷?。
查看完整描述

2 回答

?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

每個人都知道異步可以為您提供“更好的吞吐量”、“可擴展性”以及在資源消耗方面更高效。

可擴展性,是的。吞吐量:視情況而定。每個異步請求都比等效的同步請求,因此只有當可伸縮性發揮作用時,您才會看到吞吐量優勢(即,請求數多于可用線程數)。

與正確配置線程池的同步代碼相比,異步代碼實際上執行得更好嗎?

好吧,要注意的是“正確配置的線程池”。您假設您可以 1) 預測您的負載,以及 2) 有一個足夠大的服務器來處理每個請求使用一個線程。對于許多(大多數?)現實世界的生產場景,這兩個或其中一個都不正確。

來自我關于異步 ASP.NET 的文章

為什么不增加線程池的大小[而不是使用異步]?答案是雙重的:異步代碼比阻塞線程池線程擴展得更遠、更快。

首先,異步代碼比同步代碼擴展得更遠。使用更真實的示例代碼,ASP.NET 服務器(經過壓力測試)的總體可擴展性呈現成倍增長。換句話說,異步服務器可以處理數倍于同步服務器的連續請求數(兩個線程池都已調至該硬件的最大值)。但是,這些實驗(不是我做的)是在平均 ASP.NET 應用程序的預期“現實基線”上完成的。我不知道相同的結果如何轉移到 noop 字符串返回。

其次,異步代碼比同步代碼擴展得更快。這個很明顯;同步代碼可以很好地擴展到線程池線程的數量,但擴展速度不能快于線程注入率。因此,如響應時間圖的開頭所示,您對突然重載的響應非常緩慢。

我認為你所做的工作很有趣;我對內存使用差異(或者更確切地說,沒有差異)感到特別驚訝。我很樂意看到你把它寫成一篇博文。建議:

  • 使用 ASP.NET Core 進行測試。舊的 ASP.NET 只有一個部分異步的管道;ASP.NET Core 對于同步與異步的更“純粹”的比較是必要的。

  • 不要在本地測試;這樣做有很多注意事項。我建議選擇 VM 大?。ɑ騿螌嵗?Docker 容器或其他)并在云中測試可重復性。

  • 除了負載測試之外,還可以嘗試壓力測試。不斷增加負載直到服務器完全不堪重負,然后查看異步和同步服務器如何響應。

最后提醒一下(也來自我的文章):

請記住,異步代碼不會取代線程池。這不是線程池異步代碼;它是線程池異步代碼。異步代碼允許您的應用程序充分利用線程池。它使用現有的線程池并將其增加到 11 個。


查看完整回答
反對 回復 2022-12-24
?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

真正的異步代碼 (I/O) 更具可擴展性,因為它釋放線程池線程用于其他工作而不是阻塞它們。所以,對于相同數量的線程來說,它可以處理更多的請求。

但這樣做的代價是更多的控制數據結構和更多的工作。因此,(除了節省線程池線程外)它會消耗更多資源(內存、CPU)。

一切都與可用性有關,而不是性能。


查看完整回答
反對 回復 2022-12-24
  • 2 回答
  • 0 關注
  • 98 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號