我正在处理一个嵌入式系统,其RAM大小为512MB,并有足够的交换空间支持应用程序。从内核中,我通过内核cmd参数将RAM大小限制为130MB,并使用swapoff -a
禁用了交换。我还禁用了内核超额承诺,以便应用程序仅在物理内存中运行。我从/proc/cmdline
和/proc/meminfo
验证了这些更改。现在,当我运行应用程序并检查顶部值时,我的应用程序的VSZ为177m,这比实际内存还多!!这是怎么可能的?这个记忆来自哪里?
我正在处理一个嵌入式系统,其RAM大小为512MB,并有足够的交换空间支持应用程序。从内核中,我通过内核cmd参数将RAM大小限制为130MB,并使用swapoff -a
禁用了交换。我还禁用了内核超额承诺,以便应用程序仅在物理内存中运行。我从/proc/cmdline
和/proc/meminfo
验证了这些更改。现在,当我运行应用程序并检查顶部值时,我的应用程序的VSZ为177m,这比实际内存还多!!这是怎么可能的?这个记忆来自哪里?
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
swapoff -a
不会导致VMM使用。swap仅用于读写内存或程序数据。对于程序代码,Linux 虚拟文件系统有一种定位(重新加载)页面的方法。如果代码跳转到地址,则代码会故障并从磁盘加载数据。通过这种方式,当程序启动时,整个程序并不会全部加载到内存中;只有起始地址页面。同样,当受到内存压力时,很少使用的代码可以被逐出。 - artless noise
/proc/$PID/maps
- Basile Starynkevitch