1

私はマルチスレッドの Linux サーバー (64 ビット) を持っています。これは、数日間実行してリクエストを処理することになっています。しかし、しばらくの間、プロセスのメモリ使用率が急激に上昇しています。しばらくするとこれがダウンすることもありますが、しきい値の制限に達した後にプロセスがクラッシュすることもあります。

smapspmapを使用してマッピングを調べたところ、ヒープ サイズが 390 MB であるのに対し、その時点での合計メモリ使用量は 4.5GB であることがわかりました。

pmaps の出力に多くの anon メモリ セグメントが表示されたので、strace を実行したところ、メモリ ジャンプ時にプロセスが 134MB のサイズで mmap を呼び出していたことがわかりました。

29045 19:52:45 mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aabf8000000
29045 19:53:12 mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aac00000000
29045 19:53:21 mmap(0x2aac04000000, 67108864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aac04000000
29045 19:53:28 mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aac08000000

mallocのラッパーを作成したところ、アプリケーションによって行われた最大メモリ割り当ては、ジャンプ時に 1 つの 30MB 割り当てと 1 つの 20MB 割り当てであることがわかりました。そして、この記憶は解放されました。

プロセスがこれらの大きな mmap を呼び出している理由を知る必要がありますか?

追加情報:

私は mmap で中断し、次の BT を見つけました:

#0  0x00000032af6d0940 in mmap64 () from /lib64/libc.so.6
#1  0x00000032af66f9cf in new_heap () from /lib64/libc.so.6
#2  0x00000032af673515 in _int_malloc () from /lib64/libc.so.6
#3  0x00000032af674cde in malloc () from /lib64/libc.so.6

malloc は 5060 バイトで呼び出されましたが、mmap はサイズ 134217728 で呼び出されました。malloc が new_heap() を呼び出すのはなぜですか?

4

1 に答える 1