簡體   English   中英

.NET 4垃圾收集器的可伸縮性

[英]Scalability of the .NET 4 garbage collector

我最近對.NET 4垃圾收集器進行了基准測試,從多個線程中集中分配。 當分配的值記錄在一個數組中時,我沒有像我預期的那樣觀察到沒有可伸縮性(因為系統爭用對共享舊代的同步訪問)。 但是,當分配的值立即被丟棄時,我驚恐地發現沒有可擴展性!

我曾預計臨時案例幾乎是線性擴展的,因為每個線程應該簡單地擦除托兒所gen0干凈並重新開始而不爭用任何共享資源(沒有任何東西幸存到老一代並且沒有L2緩存未命中因為gen0很容易適合L1緩存)。

例如, 這篇MSDN文章說

無同步分配在多處理器系統上,托管堆的第0代將被分成多個內存競技場,每個線程使用一個競技場。 這允許多個線程同時進行分配,因此不需要對堆進行獨占訪問。

任何人都可以驗證我的發現和/或解釋我的預測和觀察之間的這種差異嗎?

不太確定這是什么以及你在機器上看到的確切內容。 但是,您的計算機上有兩個不同版本的CLR。 Mscorwks.dll和mscorsvc.dll。 前者是您在工作站上運行程序時獲得的程序,后者是Windows的某個服務器版本(如Windows 2003或2008)。

工作站版本對您的本地PC很友好,它不會吞噬所有機器資源。 在GC正在進行時,您仍然可以閱讀您的電子郵件。 服務器版本經過優化,可在服務器級硬件上進行擴展。 大量的RAM(GC不會那么快)和大量的CPU核心(垃圾收集在多個核心上)。 您引用的文章可能會談到服務器版本。

您可以在工作站上選擇服務器版本,使用.config文件中的<gcServer>元素。

這個問題不是一個完整的答案,而是為了澄清一些誤解:.NET GC只在工作站模式下並發。 在服務器模式下,它使用stop-the-world並行GC。 更多細節在這里 .NET中的單獨托兒所主要是為了避免分配時的同步; 它們仍然是全局堆的一部分,不能單獨收集。

我可能會對發生的事情進行幾次猜測。

(1)如果你有一個線程並且在0代中有空閑空間,那么只有在分配了M個字節后GC才會運行。

(2)如果你有N個線程並且GC將第0代分成每個線程的N / M空間,那么每次線程分配N / M字節時GC都會運行。 這里的showstopper是GC需要“停止世界”(即掛起所有正在運行的線程)以便標記線程根集的引用。 這不便宜。 因此,GC不僅會更頻繁地運行,而且會在每個集合上做更多的工作。

當然,另一個問題是多線程應用程序通常不具有緩存友好性,這也會對性能產生重大影響。

我不認為這是一個.NET GC問題,而是一般的GC問題。 一位同事曾經運行過一個簡單的“乒乓”基准測試,使用SOAP在兩個線程之間發送簡單的整數消息。 當兩個線程處於不同的進程時,基准測試的運行速度提高了兩倍,因為內存分配和管理完全解耦!

非常快速,易於查看(直接在根,分配空值)和大量發布可以讓GC變得急切而且緩存本地堆的整個想法是一個很好的夢想:-)即使你有完全分離的線程局部堆(你不這樣做)句柄指針表仍然必須是完全不穩定的,只是為了使一般的多CPU場景安全。 哦,請記住,有很多線程,CPU緩存是共享的,內核需要優先,所以它不僅僅適合你:-)

還要注意帶有雙指針的“堆”有2個部分 - 要給出的內存塊和句柄指針表(這樣可以移動塊但是代碼總是有一個地址)。 這樣的表是一個關鍵但非常精簡的流程級資源,而且只是強調它的唯一方法是通過大量快速發布來泛濫它 - 所以你設法做到了:-))

一般來說,GC的規則是 - 泄漏:-)當然不是永遠,但只要你能做到。 如果你還記得人們如何說“不要強迫GC收藏”嗎? 這是故事的一部分。 此外,“停止世界”集合實際上比“並發”更有效,並且過去通過更好的循環竊取或合作者合作來獲知。 只有標記階段需要凍結調度程序,並且在服務器上有幾個線程正在執行它(N核心無論如何都是空閑的:-)另一個的唯一原因是它可以進行實時操作,比如播放視頻抖動就像較長的線程量子一樣。

因此,如果您在短暫且頻繁的CPU突發(小型alloc,幾乎沒有工作,快速發布)上與基礎設施競爭,您唯一能看到/測量的就是GC和JIT噪聲。

如果這是真實的東西,即不僅僅是試驗,你可以做的最好的事情是在堆棧(結構)上使用大值數組。 它們不能被強制堆上並且像本地一樣本地可以得到,並且不受任何后門移動=>緩存必須愛它們:-)這可能意味着切換到“不安全”模式,使用普通指針並且可能你自己做一些alloc(如果yopu需要像列表一樣簡單的東西),但這是一個很小的價格來支付GC :-)試圖強制數據進入緩存也取決於保持你的堆棧傾斜 - 記得你並不孤單。 同時為你的線程提供一些值得至少在發布版本之間運行的工作可能有所幫助。 最糟糕的情況是,如果你在一個信號量子中分配和釋放。

或解釋我的預測和觀察之間的這種差異?

基准測試很難。
對不完全控制的子系統進行基准測試更加困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM