3

私たちのソフトウェアはアクター モデル システムを実装しており、小さなオブジェクトを頻繁に割り当て/割り当て解除しています。各オブジェクトがメモリ リークなしで破棄されると確信しています。(valgrind と tcmalloc ツールを使用して、ソフトウェアのメモリ リークをチェックしました。リークは見つかりませんでした。)

glibc で malloc を置き換えるために tcmalloc を使用するように変更すると、プロセスが OOM (メモリ不足) によって強制終了されるまでメモリが増加し続けることがわかりました。その後、glibc にも同じ問題があることがわかりましたが、増加率は tcmalloc よりも小さくなっています。

malloc_stats() を使用してメモリ情報を表示しました

最初の実行後 (トップ ショー 0.96G)'


  • MALLOC: 960110592 (915.6 MB) ヒープ サイズ
  • MALLOC: 15886016 (15.2 MB) アプリケーションで使用中のバイト
  • MALLOC: 907419648 (865.4 MB) ページ ヒープの空きバイト数
  • MALLOC: 0 (0.0 MB) ページ ヒープでマップされていないバイト
  • MALLOC: 27121208 (25.9 MB) 中央キャッシュの空きバイト数
  • MALLOC: 151040 (0.1 MB) 転送キャッシュの空きバイト数
  • MALLOC: 9532680 (9.1 MB) スレッド キャッシュの空きバイト数
  • MALLOC: 14275 スパン使用中
  • MALLOC: 27 個のスレッド ヒープが使用中
  • MALLOC: 7602176 (7.2 MB) 割り当てられたメタデータ

5回目の同じ実行後(トップショー1.2G)

  • MALLOC: 1173131264 (1118.8 MB) ヒープサイズ
  • MALLOC: 18001048 (17.2 MB) アプリケーションで使用中のバイト
  • MALLOC: 1082458112 (1032.3 MB) ページ ヒープの空きバイト数
  • MALLOC: 21168128 (20.2 MB) ページ ヒープでマップされていないバイト
  • MALLOC: 37992328 (36.2 MB) 中央キャッシュの空きバイト数
  • MALLOC: 252928 (0.2 MB) 転送キャッシュの空きバイト数
  • MALLOC: 13258720 (12.6 MB) スレッド キャッシュの空きバイト数
  • MALLOC: 17651 スパン使用中
  • MALLOC: 27 個のスレッド ヒープが使用中
  • MALLOC: 8126464 (7.8 MB) 割り当てられたメタデータ

このようなデータからわかります。5 回目の同じ動作の後、17.2 のみがソフトウェアで使用されます。ただし、tcmalloc は、システムに戻らずに 1.1G のメモリを保持します。もちろん、tcmalloc がそれらのメモリを保持するかどうかは問題ではありません。しかし、OOM によってプログラムが強制終了されると、増加し続けます (実際に使用されるメモリは 1G 未満です)。

ヒープの断片化に関連しているとは思えません。どなたか、私たちと共有できる経験をお持ちですか? https://bugzilla.redhat.com/show_bug.cgi?id=843478と同じ状況だと思い ます

どうもありがとう。

4

2 に答える 2

1

Boehm の保守的な GCを使用し、アプリケーションでの代わりにGC_MALLOCandを使用することをお勧めします (そしての代わりに、明示的な-ing を回避することもできますが、GC はそれらを実行します)。または、(システム Glibc malloc と共に) valgrindを使用して、メモリ リークを見つけることもできます。Boehm の GC を使用している場合は、割り当てられたメモリ ゾーンを明示的にクリアすることを忘れないでください。GC_MALLOC_ATOMICmallocGC_FREEfreefree

多くの小さなオブジェクトのサイズが粗いことを確認することをお勧めします。たとえば、8、9、10、11、12、13、14、15、または 16 ワードのオブジェクトではなく、8 または 12 または 16 ワードのオブジェクトを割り当てます。たとえば、サイズが 2 の累乗または2の累乗の3倍。

また、 setrlimit(2)を使用してメモリ空間を制限できることを忘れないでください。たとえばulimit、端末で実行されている bash の組み込みを使用します。これにより、テストが容易になります。また、pmaporを使用/proc/$(pidof yourapp)/mapsすると、使用されているアドレス空間を理解するのに役立つ可能性があります。

PS。Boehm GC も、あらゆる種類のmalloc(tcmallocまたは Glibcを含むmalloc) も、メモリの断片化に取り組むことができません。断片化が疑われる場合は、メモリ ゾーンをアドレス空間に移動する必要があります (つまり、独自の正確なコピー、世代別 GC をコーディングするか、既存のものを再利用する必要がある場合があります)。

于 2013-03-22T09:01:10.283 に答える