假设我在具有 64 Gb RAM 的 64 位 Linux 机器上运行我的程序。在我开始后的非常小的 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
,SWAP
下降到 56g
左右。
top
输出 header 中的常见 Swap
统计信息显示交换文件使用量增加,这是预期的,因为我的程序将不得不推送大约 26 Gb 的内存页面进入交换文件。
因此,根据以上观察,SWAP
列只是报告我的进程的非 RES
地址空间,而不管该地址空间是否已“物化”,即无论我是否已经在该虚拟内存区域中写入了一些内容。
但是有没有什么方法可以计算出有多少 SWAP
大小实际上已经“具体化”并由存储在交换文件中的东西备份? 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
关于Linux `top` 命令 : how much process memory is physically stored in swap space?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48675993/