我有一个多线程的 linux 服务器(64 位),它应该可以运行和处理几天的请求。但是一段时间以来,我看到进程的内存利用率突然上升。有时这会在一段时间后下降,但有时我的进程在达到阈值限制后会崩溃。
我使用smaps和pmap找出映射,发现堆大小为 390 MB,而当时的总内存利用率为 4.5GB。
我可以在 pmaps 输出中看到很多匿名内存段,所以我运行了 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编写了包装器,发现我的应用程序完成的最大内存分配是一个 30MB 分配和一个 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()?