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
,并且 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
地址 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
假设我 运行 我的程序在具有 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
地址 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