37

私は現在、マルチスレッド サーバー アプリケーションを大量に使用しており、優れたマルチスレッド メモリ アロケータを探しています。

これまでのところ、私は間で引き裂かれています:

  • サンズ ウメン
  • Google の tcmalloc
  • Intel のスレッド ビルディング ブロック アロケータ
  • エメリー・バーガーの財宝

私が見つけたものからは、hoard が最速かもしれませんが、今日まで聞いたことがなかったので、本当に見た目と同じくらい良いかどうかは懐疑的です. これらのアロケーターを試してみた経験のある人はいますか?

4

8 に答える 8

17

私は tcmalloc を使用し、Hoard について読みました。どちらも同様の実装を持ち、スレッド/CPU の数に関してほぼ線形のパフォーマンス スケーリングを実現します (それぞれのサイトのグラフによると)。

したがって、パフォーマンスが非常に重要である場合は、パフォーマンス/負荷テストを行ってください。それ以外の場合は、サイコロを振ってリストから 1 つを選んでください (ターゲット プラットフォームでの使いやすさによって重み付けされています)。

また、trshiv のリンクから、Hoard、tcmalloc、および ptmalloc の速度はほぼ同等のようです。全体として、tt は、ptmalloc が可能な限りスペースを取らないように最適化されているように見えます。Hoard は速度とメモリ使用量のトレードオフのために最適化されており、tcmalloc は純粋な速度のために最適化されています。

于 2008-09-29T04:01:01.157 に答える
11

アプリケーションに適したメモリ アロケータを特定する唯一の方法は、いくつか試してみることです。言及されたすべてのアロケーターは賢い人々によって書かれたものであり、特定のマイクロベンチマークで他のアロケーターを打ち負かします. アプリケーションが 1 日中、スレッド A で 1 つの 8 バイト チャンクを malloc し、スレッド B でそれを解放するだけで、他に何も処理する必要がない場合は、メモリ アロケータを作成して、これまでに挙げたもの。他の多くの場合、それはあまり役に立ちません。:)

私は勤務先で Hoard を使用した経験があります (その経験の結果として、最近の 3.8 リリースで対処された、より目立たないバグの 1 つが発見されたほどです)。これは非常に優れたアロケーターですが、どれだけ優れているかはワークロードによって異なります。また、コードを GPL 化せずに商用プロジェクトで使用するには、Hoard に料金を支払う必要があります (ただし、それほど高価ではありません)。

非常にわずかに変更された ptmalloc2 は、かなり長い間 glibc の malloc の背後にあるアロケーターであり、信じられないほど広く使用され、テストされています。安定性が何よりも重要なら、それは良い選択かもしれませんが、リストに記載されていないので、アウトだと思います。特定のワークロードでは、これはひどいことですが、汎用的な malloc についても同じことが言えます。

お金を払っても構わないと思っているなら (そして、私の経験では価格が手頃なのであれば)、SmartHeap SMPも良い選択です。言及されている他のアロケーターのほとんどは、LD_PRELOAD できるドロップインの malloc/free new/delete 置換として設計されています。SmartHeap も同様に使用できますが、アロケーターを思いのままに微調整できる割り当て関連の API 全体も含まれています。私たちが行ったテスト (これもまた、特定のアプリケーションに非常に固有のものです) では、SmartHeap は、一時的な malloc の代替として機能する場合、Hoard とほぼ同じパフォーマンスでした。両者の本当の違いは、カスタマイズの程度です。アロケーターの汎用性が低いほど、パフォーマンスが向上します。

また、ユース ケースによっては、汎用のマルチスレッド アロケータをまったく使用したくない場合があります。すべて同じサイズのオブジェクトを常に malloc して解放している場合は、単純なスラブ アロケータを作成するだけでよいでしょう。スラブの割り当ては、Linux カーネルのいくつかの場所で、その説明に適合するように使用されています。(さらにいくつかの便利なリンクを提供しますが、私は「新しいユーザー」であり、スタックオーバーフローは、新しいユーザーが1つの回答で役に立たないようにすることを許可されていないと判断しまし。ただし、Googleは十分に支援できます。)

于 2009-11-14T19:46:27.850 に答える
5

個人的には、マルチスレッド アロケーターとして ptmalloc を好み、お勧めします。Hoard は優れていますが、私のチームが数年前に Hoard と ptmalloc を評価したところ、ptmalloc の方が優れていました。私の知る限り、ptmalloc は何年も前から存在しており、マルチスレッド アロケーターとして非常に広く使用されています。

この比較は役に立つかもしれません。

于 2008-09-29T04:38:42.843 に答える
4

おそらく、これはあなたが求めていることにアプローチするための間違った方法かもしれませんが、おそらく別の戦術を採用することができます. 本当に高速なメモリ アロケータを探している場合は、おそらく変数のスタック割り当てを回避できるのに、メモリの割り当てになぜそんなに時間を費やす必要があるのか​​ を尋ねる必要があります。スタックの割り当ては面倒ですが、正しく行うことでミューテックスの競合を大幅に回避できるだけでなく、奇妙なメモリ破損の問題をコードから除外することもできます。また、断片化が少なくなる可能性があるため、役立つ可能性があります。

于 2008-09-29T02:22:35.930 に答える
3

数年前に私が働いていたプロジェクトで買いだめを使用しました。それはうまくいくように見えました。私は他のアロケーターを使った経験がありません。さまざまなものを試して負荷テストを行うのはかなり簡単なはずですよね?

于 2008-09-29T02:26:24.830 に答える
2

ご質問への返信が遅くなるかもしれませんが、

パフォーマンスが低下しているのに、なぜ malloc を実行するのですか?

より良い方法は、初期化時に大きなメモリ ウィンドウの malloc を実行してからlight weight Memory managerlease out the memory chunks at run time.

これにより、ヒープが拡張された場合にシステム コールが発生する可能性が回避されます。

于 2012-04-25T01:03:23.843 に答える