为什么Linux中的内存使用量超过物理RAM?

6

我正在处理一个嵌入式系统,其RAM大小为512MB,并有足够的交换空间支持应用程序。从内核中,我通过内核cmd参数将RAM大小限制为130MB,并使用swapoff -a禁用了交换。我还禁用了内核超额承诺,以便应用程序仅在物理内存中运行。我从/proc/cmdline/proc/meminfo验证了这些更改。现在,当我运行应用程序并检查顶部值时,我的应用程序的VSZ为177m,这比实际内存还多!!这是怎么可能的?这个记忆来自哪里?


2
内存映射文件?同一内存映射在虚拟地址空间中出现两次?请检查进程内存映射。 - Matteo Italia
http://linuxatemyram.com/ 和 /proc/$PID/maps - Basile Starynkevitch
1个回答

7

VSZ是由进程使用的虚拟内存大小。它比您的物理内存大小高是正常的,因为这是其主要设计思想之一。您应该查看Resident size(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


1
我不认为你解释过为什么swapoff -a不会导致VMM使用。swap仅用于读写内存或程序数据。对于程序代码,Linux 虚拟文件系统有一种定位(重新加载)页面的方法。如果代码跳转到地址,则代码会故障并从磁盘加载数据。通过这种方式,当程序启动时,整个程序并不会全部加载到内存中;只有起始地址页面。同样,当受到内存压力时,很少使用的代码可以被逐出。 - artless noise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接