1

假设我在具有 64 Gb RAM 的 64 位 Linux 机器上运行我的程序。在我开始后立即执行的非常小的 C 程序中

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

这将我的数据段向前移动了 120 Gb。

在我的进程的上述sbrk调用top条目显示RES为某个低值之后,VIRTat120gSWAPat 120g

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

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

top这导致我的流程的条目发生了一些变化:VIRT预期保持在120gRES几乎变成64gSWAP下降到大约56g

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

因此,根据上述观察,SWAPcolumn 仅报告我的进程的非RES地址空间,而不管该地址空间是否已“物化”,即无论我是否已将某些内容写入该虚拟内存区域。

但是有没有办法弄清楚这个SWAP大小中有多少实际上已经“物化”并由存储在交换文件中的东西支持?即有什么方法可以top为我的进程显示 26 Gb 的值吗?

4

1 回答 1

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

于 2018-02-08T15:23:27.210 回答