2 回答

TA貢獻1812條經驗 獲得超5個贊
每個人都知道異步可以為您提供“更好的吞吐量”、“可擴展性”以及在資源消耗方面更高效。
可擴展性,是的。吞吐量:視情況而定。每個異步請求都比等效的同步請求慢,因此只有當可伸縮性發揮作用時,您才會看到吞吐量優勢(即,請求數多于可用線程數)。
與正確配置線程池的同步代碼相比,異步代碼實際上執行得更好嗎?
好吧,要注意的是“正確配置的線程池”。您假設您可以 1) 預測您的負載,以及 2) 有一個足夠大的服務器來處理每個請求使用一個線程。對于許多(大多數?)現實世界的生產場景,這兩個或其中一個都不正確。
來自我關于異步 ASP.NET 的文章:
為什么不增加線程池的大小[而不是使用異步]?答案是雙重的:異步代碼比阻塞線程池線程擴展得更遠、更快。
首先,異步代碼比同步代碼擴展得更遠。使用更真實的示例代碼,ASP.NET 服務器(經過壓力測試)的總體可擴展性呈現成倍增長。換句話說,異步服務器可以處理數倍于同步服務器的連續請求數(兩個線程池都已調至該硬件的最大值)。但是,這些實驗(不是我做的)是在平均 ASP.NET 應用程序的預期“現實基線”上完成的。我不知道相同的結果如何轉移到 noop 字符串返回。
其次,異步代碼比同步代碼擴展得更快。這個很明顯;同步代碼可以很好地擴展到線程池線程的數量,但擴展速度不能快于線程注入率。因此,如響應時間圖的開頭所示,您對突然重載的響應非常緩慢。
我認為你所做的工作很有趣;我對內存使用差異(或者更確切地說,沒有差異)感到特別驚訝。我很樂意看到你把它寫成一篇博文。建議:
使用 ASP.NET Core 進行測試。舊的 ASP.NET 只有一個部分異步的管道;ASP.NET Core 對于同步與異步的更“純粹”的比較是必要的。
不要在本地測試;這樣做有很多注意事項。我建議選擇 VM 大?。ɑ騿螌嵗?Docker 容器或其他)并在云中測試可重復性。
除了負載測試之外,還可以嘗試壓力測試。不斷增加負載直到服務器完全不堪重負,然后查看異步和同步服務器如何響應。
最后提醒一下(也來自我的文章):
請記住,異步代碼不會取代線程池。這不是線程池或異步代碼;它是線程池和異步代碼。異步代碼允許您的應用程序充分利用線程池。它使用現有的線程池并將其增加到 11 個。

TA貢獻1811條經驗 獲得超4個贊
真正的異步代碼 (I/O) 更具可擴展性,因為它釋放線程池線程用于其他工作而不是阻塞它們。所以,對于相同數量的線程來說,它可以處理更多的請求。
但這樣做的代價是更多的控制數據結構和更多的工作。因此,(除了節省線程池線程外)它會消耗更多資源(內存、CPU)。
一切都與可用性有關,而不是性能。
- 2 回答
- 0 關注
- 98 瀏覽
添加回答
舉報