让我们说我在64位Linux机器上运行我的程序,内存为64 Gb。在我开始的非常小的C程序中,我做了
void *p = sbrk(1024ull * 1024 * 1024 * 120);
这使我的数据段突破120 Gb。
在我的流程的上述sbrk
来电top
条目显示RES
某个较低值,VIRT
120g
和SWAP
之后在120g
。
在此操作之后,我将内容写入上述区域的前90 Gb
memset(p, 0xAB, 1024ull * 1024 * 1024 * 90);
这导致我的流程的top
条目发生了一些变化:VIRT
预计仍为120g
,RES
几乎变为64g
,{{1} }下降到SWAP
左右。
56g
输出标题中的常见Swap
统计信息显示交换文件使用量增加,这是预期的,因为我的程序必须将大约26 Gb的内存页面推送到交换文件中。 / p>
因此,根据上述观察结果,top
列只会报告我的流程的非SWAP
地址空间,无论此地址空间是否已实现" ,即不管我是否已经在虚拟内存区域写了一些东西。
但是有没有办法弄清楚RES
大小实际上有多少"实现了"并由交换文件中存储的东西备份?即有没有办法让SWAP
为我的流程显示26 Gb值?
答案 0 :(得分:1)
行为取决于您使用的procps版本。例如,在版本3.0.5中,SWAP值等于:
task->size - task->resident
这正是你遇到的。男人top.1说:
VIRT = SWAP + RES
然而,Procps-ng读取/ proc / pid / status并正确设置SWAP
https://gitlab.com/procps-ng/procps/blob/master/proc/readproc.c#L383
因此,您可以更新procps或直接查看/ proc / pid / status