【发布时间】: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 处于120g,SWAP 处于120g。
在此操作之后,我在上述区域的前 90 Gb 中写入了一些内容
memset(p, 0xAB, 1024ull * 1024 * 1024 * 90);
这会导致我的进程的 top 条目发生一些变化:VIRT 预计将保持在 120g,RES 几乎变为 64g,SWAP 下降到 56g 附近。
top 输出标头中的常见 Swap 统计信息显示交换文件使用量增加,这是意料之中的,因为我的程序必须将大约 26 Gb 的内存页面推送到交换文件中。
因此,根据上述观察,SWAP 列仅报告我的进程的非RES 地址空间,而不管该地址空间是否已“物化”,即无论我是否已经在虚拟内存。
但是有什么方法可以计算出SWAP 的大小实际上有多少被“物化”并由存储在交换文件中的东西备份? IE。有什么方法可以让top 为我的进程显示 26 Gb 的值?
【问题讨论】:
标签: linux virtual-memory top-command swapfile memory-overcommitment