【问题标题】:Why memory usage is more than physical RAM in Linux?为什么在 Linux 中内存使用量超过物理 RAM?
【发布时间】:2014-12-17 12:28:24
【问题描述】:

我正在开发一个具有 512MB RAM 和足够交换内存来支持应用程序的嵌入式系统。在内核中,我将内核 cmd 参数的 RAM 大小限制为 130MB。并使用swapoff -a 禁用交换。我还禁用了内核过度使用,以便应用程序可以单独在物理内存中运行。我验证了来自/proc/cmdline/proc/meminfo 的更改。现在,当我运行应用程序并检查最高值时,我的应用程序的 VSZ 为 177m,超过了实际内存!!这怎么可能?这段记忆是从哪里来的?

【问题讨论】:

  • 内存映射文件?相同的内存在虚拟地址空间中映射了两次?检查进程内存映射。
  • linuxatemyram.com/proc/$PID/maps

标签: c linux memory memory-management linux-kernel


【解决方案1】:

VSZ 是进程使用的虚拟内存大小。它高于物理内存的大小是正常的,因为这是其中的主要思想之一。您应该查看驻留大小 (RSS),它是进程使用的实际物理内存。

看这个例子:

我有一个 nginx 进程正在运行:

 ps -o rss,vsz,cmd ax | grep -i nginx | head -n1
  956  31248 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

rss - 956 kB
vsz - 31248 kB

所以,这意味着这个进程正在使用 956kB 的物理内存和 31MB 的虚拟内存。

与您一样,禁用交换 (swapoff -a) 不会禁用虚拟内存。

在此处阅读有关虚拟内存的信息: Virtual memory

【讨论】:

  • 我认为您没有解释为什么 swapoff -a 不会导致使用 VMM。 swap 仅用于 read-write 内存或程序数据。对于程序代码,Linux 虚拟文件系统有一种方法来定位(重新加载)页面。如果代码跳转到一个地址,那么代码错误并且数据从磁盘加载。这样,当程序启动时,整个事情不会加载到内存中;只有 start 地址页面。同样,在内存压力下,很少使用的代码也会受到影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 2018-09-07
  • 2016-06-27
  • 2014-12-01
  • 2014-03-04
  • 1970-01-01
相关资源
最近更新 更多