Linux `top` 命令:有多少进程内存物理存储在交换 space 中?

Linux `top` command: how much process memory is physically stored in swap space?

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

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

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

在我的进程的上述 sbrk 调用 top 条目之后显示 RES 处于某个低值,VIRT 处于 120g,并且 SWAP120g.

在这个操作之后,我在上面的区域的前 90 Gb 中写了一些东西

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

这会导致我的进程的 top 条目发生一些变化:VIRT 预计保持在 120gRES 几乎变为 64gSWAP 下降到 56g.

左右

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

因此,根据以上观察,SWAP 列仅报告我的进程的非 RES 地址 space 而不管此地址 space 是否已被 "materialized",即不管我是否已经在该虚拟内存区域中写入了一些东西。

但是有什么方法可以计算出 SWAP 大小中有多少实际上已经 "materialized" 并被存储在交换文件中的东西备份了吗? IE。有什么方法可以让 top 显示我的进程的 26 Gb 值?

行为取决于您使用的 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