Linux进程显示突然的内存跳跃



我有一个mutlithreaded linux服务器(64位),它应该运行并处理几天的请求。但一段时间以来,我看到这个过程的内存利用率突然上升。有时这会在一段时间后下降,但有时我的进程在达到阈值限制后崩溃。

我使用smapspmap来查找映射,发现堆大小为390MB,而当时的总内存利用率为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()?

您可以尝试将GDB附加到进程,并在mmap()上设置一个条件断点。这将为您提供巨额拨款的回溯。

最新更新