【问题标题】:glibc Arena system_mem does not add up to the amount of VSS or RSSglibc Arena system_mem 加起来不等于 VSS 或 RSS 的量
【发布时间】:2020-09-25 02:25:59
【问题描述】:

我有一个过程,我试图说明所有内存的去向。我的第一个想法是使用 gdb 遍历所有 arenas 并像这样输出它们的系统内存(我已将进程配置为 32 个 arenas):

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 ]

块 42 从 7fc18... -> 7fc18d 跃入地址空间。同时,我们在 07fc1840c8000 之后继续处理这些 pmapped 地址,这些地址似乎没有被现有块考虑。

我在 RHEL7 下使用 glibc 2.17。我错过了什么吗???我怎样才能拥有系统默认 malloc 实现似乎没有考虑的内存区域?或者也许我在某个地方严重误解了某些东西。我的内存统计怎么这么少?

提前致谢!!

【问题讨论】:

    标签: linux gdb malloc redhat glibc


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多