我有一个多读的linux服务器(64位),它应该运行并处理几天的请求。但是有一段时间,我看到进程的内存利用率突然跳了起来。有时这会在一段时间后下降,但有时我的进程在达到阈值限制后就会崩溃。
我使用、smaps、和pmap来查找映射,发现堆大小为390 MB,而当时的内存总利用率为4.5GB。
我可以在pmaps输出中看到大量的anon内存段,因此我运行了strace,并发现在memery跳转时,我的进程正在调用大小为134 my的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编写了包装器,发现应用程序在跳转时所做的最大内存分配是一个30 my的分配和一个20 my的分配。这个记忆被释放了。
我需要知道为什么我的流程要调用这些大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使用5060字节调用malloc,而调用mmap的大小为134217728。为什么malloc要调用new_heap()?
发布于 2013-07-26 09:59:24
您可以尝试将GDB附加到进程,并在mmap()上设置一个条件断点。这将为您提供大量拨款的回溯。
https://stackoverflow.com/questions/17874252
复制相似问题