glibc Arena system_mem 不加起来 VSS 或 RSS 量

glibc Arena system_mem does not add up to the amount of VSS or RSS

我有一个过程试图解释所有内存的去向。我的第一个想法是用 gdb 遍历所有竞技场并像这样输出它们的系统内存(我已经将进程配置为 32 个竞技场):

define arenaSizeWalk
  set var $n = main_arena
  set var $size = 0
  set var $count = 0
  while $count < 32
    set var $size = $n.system_mem
    set var $n = $n.next
    set var $count = $count + 1
    printf "%d\n", $size
  end
end

但是,这很短。这加起来大约 3GB。但是我从 pmap 收集到的总内存占用量(不包括堆栈保护和加载的库)是 25GB。

此外,我使用 gdb-heap 转储所有内存块并将它们与 pmap 的输出进行比较

From heap all:
...
39: 0x00007fc1840c8000 -> 0x00007fc1841c8fff  inuse: 1052672 bytes (<MChunkPtr chunk=0x7fc1840c8000 mem=0x7fc1840c8010 prev_size=0 IS_MMAPPED chunksize=1052672 memsize=1052656>)
40: 0x00007fc1841c9000 -> 0x00007fc184649fff  inuse: 4722688 bytes (<MChunkPtr chunk=0x7fc1841c9000 mem=0x7fc1841c9010 prev_size=0 IS_MMAPPED chunksize=4722688 memsize=4722672>)
41: 0x00007fc18464a000 -> 0x00007fc18474afff  inuse: 1052672 bytes (<MChunkPtr chunk=0x7fc18464a000 mem=0x7fc18464a010 prev_size=0 IS_MMAPPED chunksize=1052672 memsize=1052656>)
42: 0x00007fc1d401b000 -> 0x00007fc1d4044fff  inuse: 172032 bytes (<MChunkPtr chunk=0x7fc1d401b000 mem=0x7fc1d401b010 prev_size=0 IS_MMAPPED chunksize=172032 memsize=172016>)
...
From pmap:
00007fc1840c8000   6668K rw---   [ anon ]
00007fc18474c000   1024K rw---   [ anon ]
00007fc18484d000   1024K rw---   [ anon ]
00007fc18494e000   1024K rw---   [ anon ]
00007fc184a4f000   1024K rw---   [ anon ]
00007fc184b50000   1024K rw---   [ anon ]
00007fc184c51000   1024K rw---   [ anon ]
00007fc184d52000   1024K rw---   [ anon ]
00007fc184e53000   1024K rw---   [ anon ]
00007fc184f54000   1024K rw---   [ anon ]

Chunk 42 的地址 space 从 7fc18... -> 7fc18d 跳跃。同时,我们在 07fc1840c8000 之后处理了这些 pmapped 地址,这些地址似乎没有被现有块考虑在内。

我在 RHEL7 下使用 glibc 2.17。我错过了什么吗???我如何拥有系统默认 malloc 实现似乎未考虑的内存区域?或者也许我在某处严重误解了某些事情。我的内存统计怎么这么短?

提前致谢!!

我想通了。无法以这种方式跟踪内存区域的原因是因为程序的某些其他部分直接调用 mmap() 而不是使用 malloc() 或 new。

只有那些与 malloc 接口的分配才能通过检查 main_arena 或利用 gdb-heap 进行追踪。