【问题标题】:Linux `top` command: how much process memory is physically stored in swap space?Linux `top` 命令:交换空间中物理存储了多少进程内存?
【发布时间】:2018-02-08 01:18:27
【问题描述】:

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

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

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

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

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

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

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

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

因此,根据上述观察,SWAP 列仅报告我的进程的非RES 地址空间,而不管该地址空间是否已“物化”,即无论我是否已经在虚拟内存。

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

【问题讨论】:

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


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 2014-06-10
      • 2018-09-07
      • 2017-09-12
      • 2015-08-27
      相关资源
      最近更新 更多