私たちのソフトウェアはアクター モデル システムを実装しており、小さなオブジェクトを頻繁に割り当て/割り当て解除しています。各オブジェクトがメモリ リークなしで破棄されると確信しています。(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と同じ状況だと思い ます
どうもありがとう。