簡體   English   中英

C / C ++的多線程內存分配器

[英]Multithreaded Memory Allocators for C/C++

我目前有大量的多線程服務器應用程序,而且我正在四處尋找一個好的多線程內存分配器。

到目前為止,我陷入了兩難之間:

  • 孫s
  • 谷歌的tcmalloc
  • 英特爾的線程構建基塊分配器
  • 埃默里·伯傑的寶藏

從我發現的ho積可能是最快的,但是直到今天之前我還沒有聽說過它,所以我對它的真實性表示懷疑。 任何人都有嘗試這些分配器的個人經驗嗎?

我用過tcmalloc並了解了Hoard。 兩者都具有相似的實現,並且都相對於線程/ CPU的數量(根據它們各自站點上的圖形)實現了大致線性的性能縮放。

因此:如果性能確實至關重要,那么請進行性能/負載測試。 否則,只需擲骰子,然后選擇列出的骰子之一(根據目標平台的易用性進行加權)。

trshiv的鏈接來看,Hoard,tcmalloc和ptmalloc的速度都差不多 總體而言,tt看起來ptmalloc已針對占用盡可能少的空間進行了優化,Hoard針對速度與內存使用之間的權衡進行了優化,而tcmalloc針對純速度進行了優化。

真正判斷哪種內存分配器最適合您的應用程序的唯一方法是嘗試一些方法。 提到的所有分配器都是由聰明人編寫的,它們將在一個或多個特定的微基准上擊敗其他分配器。 如果您的應用程序整天要做的事情是在線程A中分配一個8字節的塊並在線程B中釋放它,並且根本不需要處理其他任何事情,那么您可能會編寫一個內存分配器來擊敗任何一個到目前為止列出的那些。 它只是對其他很多東西沒有什么用。 :)

我在使用Hoard的工作環境方面有一些經驗(足夠多,因此經驗發現,在3.8版中解決的一個較模糊的錯誤之一)。 這是一個非常好的分配器-但是,對您而言,分配器的好壞取決於您的工作量。 而且,您必須支付Hoard的費用(盡管它並不算太貴),才能在不使用GPL代碼的情況下在商業項目中使用它。

稍作修改的ptmalloc2一直是glibc的malloc后面的分配器,因此它得到了廣泛的使用和測試。 如果最重要的是穩定性,那么它可能是一個不錯的選擇,但是您沒有在列表中提及它,因此我認為它已經解決了。 對於某些工作負載來說,這很可怕-但對於任何通用malloc來說都是如此。

如果您願意為此付費(根據我的經驗,價格合理), SmartHeap SMP也是一個不錯的選擇。 提到的大多數其他分配器都設計為可通過LD_PRELOAD插入的malloc / free新/刪除替換。 SmartHeap也可以以這種方式使用,但它還包括一個與分配有關的完整API,可讓您根據自己的內心需求微調分配器。 在我們已經完成的測試中(同樣,非常特定於特定的應用程序),SmartHeap在用作替代式malloc替代品時的性能與Hoard大致相同。 兩者之間真正的區別在於定制程度。 您不需要分配器的通用性就可以得到更好的性能。

而且,根據您的用例,通用多線程分配器可能根本就不是您想使用的分配器; 如果您不斷地對大小相同的對象進行malloc和釋放,則可能只想編寫一個簡單的slab分配器。 Slab分配在適合該描述的Linux內核中的多個位置使用。 (我會給您幾個有用的鏈接,但我是“新用戶”,Stack Overflow決定不允許新用戶在一個答案中提供太多幫助。不過Google可以提供足夠的幫助。)

我個人更喜歡並推薦ptmalloc作為多線程分配器。 Hoard很好,但是在幾年前我的團隊在Hoard和ptmalloc之間進行的評估中,ptmalloc更好。 據我所知,ptmalloc已經存在了很多年,並且被廣泛用作多線程分配器。

您可能會發現此比較有用。

也許這是處理您要問的問題的錯誤方法,但也許可以完全采用其他策略。 如果您正在尋找一個真正快速的內存分配器,也許您應該問為什么當您可能只是不用變量的堆棧分配時,為什么需要花所有這些時間分配內存。 堆棧分配雖然很煩人,但正確完成可以節省互斥鎖爭用的方式,並且可以避免代碼中出現奇怪的內存損壞問題。 此外,您可能會有更少的碎片,這可能會有所幫助。

幾年前,我們在一個項目中使用了hoard。 看起來效果很好。 我沒有其他分配器的經驗。 嘗試不同的方法並進行負載測試應該很容易,不是嗎?

locklessinc分配器非常好,如果您有任何疑問,開發人員會響應。 他寫了一篇有關使用的一些優化技巧的文章,讀起來很有趣: http : //locklessinc.com/articles/allocator_tricks/ 過去,我使用它的效果非常好。

在此處輸入圖片說明

對您的問題的回復可能很晚,但是

如果您有性能問題,為什么還要執行malloc?

更好的方法是在初始化時對大內存窗口進行malloc,然后提出一個light weight Memory manager ,該light weight Memory managerlease out the memory chunks at run time

這樣可以避免堆擴展時系統調用的任何可能性。

您可以嘗試ltalloc (具有快速池分配器速度的通用全局內存分配器)。

暫無
暫無

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

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