我知道:
- 与磁盘进行分页和交换
- /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
不考虑实际交换读写,但它占了一些由交换使用引起的内部内核活动。