【问题标题】:Why do I see big differences in memory usage with pmap for the same process on 32bit and 64bit Linux?为什么我在 32 位和 64 位 Linux 上看到相同进程的 pmap 内存使用有很大差异?
【发布时间】:2012-02-15 16:37:34
【问题描述】:

我正在设置一个新服务器(64 位 Debian),并试图使 apache 进程尽可能小,禁用了我不需要的任何模块。然后,我将 pmap 输出与 32 位 Debian 机器上的 apache 进行了比较,打开了更多模块。看到 64 位机器上的“优化”版本似乎消耗了更多的内存,我感到非常惊讶。

pmap -d(只是摘要行)显示:

64bit: mapped: 188584K    writeable/private: 14680K    shared: 72K

32bit: mapped: 33824K    writeable/private: 7304K    shared: 888K

更仔细地查看输出。我看到 .so 库的内存分配存在差异。以libc为例……

64 位:

00007f9988e8d000    1380 r-x-- 0000000000000000 008:00001 libc-2.11.3.so

00007f9988fe6000    2044 ----- 0000000000159000 008:00001 libc-2.11.3.so

00007f99891e5000      16 r---- 0000000000158000 008:00001 libc-2.11.3.so

00007f99891e9000       4 rw--- 000000000015c000 008:00001 libc-2.11.3.so

32 位:

b7501000    1364 r-x-- 0000000000000000 008:00001 libc-2.7.so

b7656000       4 r---- 0000000000155000 008:00001 libc-2.7.so

b7657000       8 rw--- 0000000000156000 008:00001 libc-2.7.so

所以不同的是64位输出中的第二行。对于 Mode="-----" 的分配,我找不到任何解释,每个 .so 似乎都有一个,并且大小始终为 2044 或 2048。

这与 64 位机器上的内存分配有关吗?与 32 位机器相比,我每 GB RAM 获得的 procs 真的会少得多吗?

【问题讨论】:

  • 典型的 64 位程序会为代码使用更多内存,因为指令(操作码)可能更长,而立即数可能更长。基本上,内存中的每个指针都将使用两倍于 32 位的字节。
  • @ydroneaud 你说的有些道理,但我没有解释非常大的差异。

标签: linux memory-management pmap


【解决方案1】:

经过更多研究,我终于找到了this article,它说 pmap 输出中的这些“-----” 2MB 行并不表示实际内存使用情况,而是地址空间在 64 位上的使用方式的怪癖性能原因。给出的总结是:

“据报道,在 64 位 Linux 上具有大量共享库的应用程序使用的每个共享库比它们实际占用的多 2MB。这额外不会花费您任何 RAM 或交换空间,只是每个进程内的地址空间,这在 64 位平台上供应充足。根本原因是为了保持库的高效共享,但实现有点奇怪。”

我仍然很难相信在 64 位 Linux 上如何报告进程内存使用情况的这个基本错误/功能的信息是如此之难!

【讨论】:

  • 您将 内存使用情况 误认为 地址空间使用情况。第一个使用昂贵的 RAM,第二个不花钱(只是混乱)。始终使用pmap -x,如果 RSS 为 0,则意味着它只是一个不使用 任何 内存的空地址空间。
猜你喜欢
  • 2016-12-25
  • 2023-03-04
  • 1970-01-01
  • 2010-09-21
  • 2012-12-05
  • 2017-06-14
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多