在/proc/上做数字/io 包括分页和交换 I/O?

在/proc/上做数字/io 包括分页和交换 I/O?

我知道:

  • 与磁盘进行分页和交换
  • /proc/io 给出磁盘 I/O 的信息

不过,我不确定是否/proc/<pid>/io包括本来应该在 RAM 上完成但由于分页和交换而转到磁盘的 I/O。做数字/proc/<pid>/io包括分页和交换 I/O?

答案1

我有同样的问题,所以我决定对交换使用和 I/O 核算进行一些实验。

我编写了一个简单的程序,仅请求大量内存并用数据填充它:

#include <malloc.h>
#include <string.h>
#include <stdio.h>

int main() {
    for (int i = 0; i < 5000; i++) {
        void* ptr = malloc(1000000);
        memset(ptr, 42, 1000000);
    }

    // Hang for a while to allow us analyze /proc.
    puts("Finished");
    while(1);

    return 0;
}

然后我开始运行它,增加每次运行所请求的内存量(5G、10G、12G 等),并观察进程'/proc/$PID/io/proc/$PID/status。每次运行的以下参数都/proc/$PID/io保持不变(这是预期的,因为这些参数显示系统调用级IO统计):

rchar: 1948
wchar: 9
syscr: 7
syscw: 1

接下来的两个参数(根据内核 procfs 文档)显示由进程引起的实际磁盘 I/O 被设置为零(很可能程序映像已经在之前的执行中缓存在内存中,因此execve不会导致真正的磁盘 I/O):

read_bytes: 0
write_bytes: 0

当我接近 RAM 大小(16G)时,内核开始大量交换程序内存(~4G):

$ cat /proc/$PID/status | grep VmSwap
VmSwap:  3908152 kB

与此同时,一些奇怪的值出现在/proc/$PID/io

read_bytes: 307200
write_bytes: 0

当内核开始交换时出现非零值read_bytes,并且几乎保持不变(~300k),而进程使用的交换量随着每次后续运行而增加(直到它开始触发 OOMKiller)。

我重复了这些实验几次,图片保持不变:write_bytes始终为零,并read_bytes从零变为约 300-400k 的某个较小(相对于交换的内存量)值。

基于此,我认为/proc/$PID/io不考虑实际交换读写,但它占了一些由交换使用引起的内部内核活动

相关内容