質問

私は現在、いくマルチスレッドのサーバアプリケーションで、私が周辺にはショッピングのための良いマルチスレッドメモリアロケータ.

これまでに私の間で板挟みにされた:

  • 日umem
  • Googleのtcmalloc
  • インテルのスレッドビルブロックのアロケータ
  • エメリー-ベルガーの秘蔵の資料

だからこそがその場で発音を確認することが維が最速のがなかったのを聞いたので、今回、私は懐疑的だそうとしていいし、デザイン性にも優れたです。誰でも個人の経験というこallocators?

役に立ちましたか?

解決

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

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

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

他のヒント

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

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

非常にわずかに適合したptmalloc2は、かなり前からglibcのmallocのアロケーターであり、非常に広く使用され、テストされています。何よりも安定性が重要な場合、それは良い選択かもしれませんが、あなたはあなたのリストでそれを言及しなかったので、私はそれが出ていると仮定します。特定のワークロードでは、ひどいですが、汎用mallocでも同じことが言えます。

支払いを希望する場合(および私の経験では価格は妥当です)、 SmartHeap SMP も良い選択です。上記の他のアロケーターのほとんどは、ドロップインmalloc / free new / delete置換として設計されており、LD_PRELOAD'dが可能です。 SmartHeapも同様に使用できますが、アロケーターを心のコンテンツに合わせて微調整できるようにする割り当て関連のAPI全体も含まれています。私たちが行ったテスト(再び、特定のアプリケーションに非常に固有のもの)で、SmartHeapはドロップインmalloc置換として動作するときのパフォーマンスに関してHoardとほぼ同じでした。 2つの違いは、カスタマイズの程度です。アロケーターに必要な汎用性が低いほどパフォーマンスが向上します。

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

個人的には、ptmallocをマルチスレッドアロケーターとして推奨します。 Hoardは優れていますが、数年前に私のチームがHoardとptmallocの間で行った評価では、ptmallocの方が優れていました。私が知っていることから、ptmallocは長年使用されており、マルチスレッドアロケーターとして非常に広く使用されています。

この比較が便利です。

この方を間違ったアプローチが何を求めているのは、その国の異なる手法の雇用は可能です。まった高速メモリアロケータかを問い合わせておいてくださいのはなぜ必要なものに過ごその時のメモリ割り付けしてきっかけを得たスタックの配分の変数.スタックの配分がありそうな面倒からのオーダーに応えてきたのが存在する多くのミューテックス証保つとともに、不思議なメモリ破壊の問題のコードです。また、潜在的に少ない断片化できます。

私たちは数年前に働いていたプロジェクトで貯蔵庫を使いました。うまくいくように見えました。他のアロケーターについては経験がありません。さまざまなものを試して負荷テストを行うのは非常に簡単なはずです?

locklessincアロケーターは非常に優れており、質問がある場合は開発者が反応します。使用された最適化のトリックについて彼が書いた記事があり、興味深い読み物です: http://locklessinc.com / articles / allocator_tricks / 。私は過去にそれを使用して素晴らしい結果を得ました。

ここに画像の説明を入力

おそらくあなたの質問への回答が遅れていますが、

パフォーマンスに問題がある場合、mallocを実行する理由

より良い方法は、初期化時に大きなメモリウィンドウのmallocを実行してから、実行時にメモリチャンクを解放する light weight Memory manager を考え出すことです

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

ltalloc (高速プールアロケーターの速度を備えた汎用グローバルメモリアロケーター)を試すことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top