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

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

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

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

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

在上面的 sbrk 调用 top 之后,我的进程条目显示 RES 处于某个低值,VIRT120gSWAP 120g

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

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

这会导致我进程的 top 条目发生一些变化:VIRT 预计保持在 120gRES几乎变成 64gSWAP 下降到 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/

相关文章:

Linux 用户空间程序显示其内部计数器,类似于/proc/meminfo

linux - 在 Bash 脚本中使用 Expect 为 SSH 命令提供密码

.NET 垃圾收集器和 x64 虚拟内存

linux - 使用HDMI端口作为网络协议(protocol)接口(interface)?

linux - Windows 等效查找 - 删除

operating-system - 是否有关于 'The Social Network'中询问的分页qn的解释?

进程的Linux页表

php - 在*nix中,什么原因导致top命令中出现 "sleeping"?

python - 在线程中运行 'top' 会产生 SIGTTOU

android - 描述Android中的 "top"命令