我有一个mutlithreaded linux服务器(64位),应该运行和处理几天的请求 . 但是一段时间以来,我看到这个过程的内存利用率突然上升 . 有时这会在一段时间后降低,但有时我的进程在达到阈值限制后会崩溃 .
我使用 smaps 和 pmap 查找映射,发现堆大小为390 MB,而当时的总内存利用率为4.5 GB .
我可以在pmaps输出中看到很多内存段,所以我运行strace并发现在memery跳转时我的进程调用了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的跳转分配 . 这个记忆被释放了 .
我需要知道为什么我的进程会调用这些大型mmaps?
附加信息:
我打破了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
使用5060字节调用malloc,但调用mmap大小为134217728.为什么malloc调用new_heap()?
1 回答
您可以尝试将GDB附加到进程并在mmap()上设置条件断点 . 这将为您提供大量分配的回溯 .