Linux`top`命令:交换空间中物理存储了多少进程内存?

时间:2018-02-08 01:18:28

标签: linux virtual-memory top-command swapfile memory-overcommitment

让我们说我在64位Linux机器上运行我的程序,内存为64 Gb。在我开始的非常小的C程序中,我做了

void *p = sbrk(1024ull * 1024 * 1024 * 120);

这使我的数据段突破120 Gb。

在我的流程的上述sbrk来电top条目显示RES某个较低值,VIRT 120gSWAP之后在120g

在此操作之后,我将内容写入上述区域的前90 Gb

memset(p, 0xAB, 1024ull * 1024 * 1024 * 90);

这导致我的流程的top条目发生了一些变化:VIRT预计仍为120gRES几乎变为64g,{{1} }下降到SWAP左右。

56g输出标题中的常见Swap统计信息显示交换文件使用量增加,这是预期的,因为我的程序必须将大约26 Gb的内存页面推送到交换文件中。 / p>

因此,根据上述观察结果,top列只会报告我的流程的非SWAP地址空间,无论此地址空间是否已实现" ,即不管我是否已经在虚拟内存区域写了一些东西。

但是有没有办法弄清楚RES大小实际上有多少"实现了"并由交换文件中存储的东西备份?即有没有办法让SWAP为我的流程显示26 Gb值?

1 个答案:

答案 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