17

最近、jemalloc について知りました。これは、firefox で使用されるメモリ アロケータです。new および delete 演算子をオーバーライドし、malloc および free に相当する jemalloc 、つまり je_malloc および je_free を呼び出すことにより、jemalloc をシステムに統合しようとしました。1 億回の割り当てを行うテスト アプリケーションを作成しました。 jemalloc を使用すると、そのような割り当てにかかる時間が短くなりますが、CPU 使用率がかなり高くなります。さらに、malloc と比較してメモリ フット プリントも大きくなります。jemalloc分析に関するこのドキュメントを読んだ後 メモリよりも速度を最適化する手法を採用しているため、jemalloc は malloc よりもフットプリントが大きいように見えました。ただし、Jemalloc での CPU 使用率へのポインターはありません。私はマルチプロセッサ マシンで作業していると述べたいと思います。その詳細は以下に示します。

プロセッサー : 11 vendor_id : GenuineIntel cpu ファミリー : 6 モデル : 44 モデル名 : Intel(R) Xeon(R) CPU X5680 @ 3.33GHz ステッピング : 2 cpu MHz : 3325.117 キャッシュ サイズ : 12288 KB 物理 ID : 1 兄弟 : 12 コア ID : 10 cpu コア: 6 apicid: 53 fpu: はい fpu_exception: はい cpuid レベル: 11 wp: はい flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm bogomips : 6649.91 clflush サイズ : 64 cache_alignment : 64 アドレス物理管理サイズ [仮想管理サイズ] : 48 ビット

top -c -b -d 1.10 -p 24670 |を使用しています。awk -v time=$TIME '{print time,",",$9}'を実行して、CPU 使用率を追跡します。

Jemllocの統合中に誰かが同様の経験をしましたか?

ありがとう!

4

5 に答える 5

41

ある賢者は CppCon で、パフォーマンスについて推測する必要はないと言いました。代わりに測定する必要があります。

jemallocマルチスレッドの Linux アプリケーションで使用してみました。カスタム アプリケーション レベルのプロトコル サーバー (TCP/IP 経由) でした。この C++ アプリケーションは、JNI を介して Java コードを使用しました (ほぼ 5% の時間で Java を使用し、95% の時間で C++ コードを使用しました)。2 つのアプリケーション インスタンスをプロダクション モードで実行します。それぞれに 150 のスレッドがありました。

72 時間実行した後、glibc1 つは 900 M のメモリを使用し、jemallocもう 1 つは 2.2 G のメモリを使用しました。CPU 使用率に大きな違いは見られませんでした。実際のパフォーマンス (平均クライアント要求処理時間) は、両方のインスタンスでほぼ同じでした。

だから、私のテストglibcでは よりもはるかに優れていましjemallocた。もちろん、それは私のアプリケーション固有です。

結論: 断片化のためにアプリケーションのメモリ管理が効果的ではないと考える理由がある場合は、私が説明したのと同様のテストを行う必要があります。これは、特定のニーズに対応する唯一の信頼できる情報源です。jemallocが常に良い場合はglibcglibcjemalloc公式のアロケータになります。glibc常に優れている場合は、jemalloc存在しなくなります。競合他社が長い間並行して存在する場合、それぞれが独自の使用ニッチを持っていることを意味します。

于 2015-11-30T07:12:32.250 に答える
4

実際のソリューションでは、他の人がさまざまなハードウェア/環境/使用シナリオで見つけたものとは無関係であるため、この質問はここに属さない可能性があります。ターゲット システムでテストして、自分に合ったものを確認する必要があります。

より高いメモリ フットプリントに関しては、コンピューター サイエンスにおける最も古典的なパフォーマンスの最適化の 1 つは、時間とメモリのトレードオフです。つまり、後ですぐに検索できるように特定の結果をキャッシュし、頻繁な再計算を防ぎます。また、おそらくより複雑なため、内部簿記がさらに多くなるでしょう。この種のトレードオフは多かれ少なかれ予想されるはずです。特に、このような低レベルで広く使用されているコア モジュールのバリアントを選択する場合はそうです。通常、特効薬はないため、使用特性に合わせてパフォーマンス特性を調整する必要があります。

また、非常に近いGoogleのTCMallocを確認することもできますが、Jemallocは一般的にわずかにパフォーマンスが高く、時間の経過とともにヒープの断片化が少なくなると思います.

于 2012-10-23T09:43:37.977 に答える