/proc/[pid]/io 是获取进程真实磁盘 i/o 字节数的唯一可靠途径,其中 read_bytes 和 write_bytes 表示绕过 page cache 后实际落盘的数据量,需用 safe 字符串解析避免错位,且受权限限制仅能读取自身或同组/特权进程。

procfs 的 /proc/[pid]/io 是唯一可靠来源
Linux 内核不提供 syscall 或标准库接口直接读取单个进程的磁盘 I/O 字节数,/proc/[pid]/io 是唯一稳定、无需特权且被广泛支持的途径。它由内核在每次读取时动态生成,内容实时、准确,且兼容所有主流发行版(从 2.6.20+ 开始稳定存在)。
注意:不能依赖 /proc/[pid]/stat 或 /proc/[pid]/status —— 它们不暴露 rchar/wchar 之外的真正块设备 I/O;而 read_bytes 和 write_bytes 才是你需要的“实际读写磁盘的字节数”(即绕过 page cache 后落盘的数据量)。
read_bytes 和 write_bytes 字段含义必须分清
打开 /proc/[pid]/io 后,关键字段是:
read_bytes: 123456789 write_bytes: 987654321 cancelled_write_bytes: 12345
read_bytes 表示该进程向块设备(如 SSD、HDD)发起的、成功完成的读取字节数;write_bytes 是成功写入块设备的字节数 —— 这两个值排除了纯内存操作(如 memcpy)、page cache 命中读、或 writeback 延迟写入未落盘的部分。
-
cancelled_write_bytes表示因 truncation、unlink等导致的已计入但最终未落盘的写入量,通常可忽略,除非你在做精确审计 -
rchar/wchar是系统调用层字节数(含 cache 读写),远大于read_bytes/write_bytes,不要混淆 - 字段顺序固定,但行末可能有空格或换行,建议用
std::string::find+std::stoll解析,而非按行号硬索引
C++ 读取示例:避免常见解析错误
直接用 std::ifstream 读取 /proc/[pid]/io 即可,但要注意以下几点:
- 路径必须拼成
"/proc/" + std::to_string(pid) + "/io",不能漏掉前导斜杠或尾部/io - 文件可能因进程退出而瞬间消失,
open()失败或读取时返回ENOENT是正常现象,需检查ifstream::is_open()和failbit - 字段值为十进制整数,但可能极大(TB 级应用可达 1e15),务必用
long long或int64_t存储 - 不要用
operator>>直接读整数 —— 它会跳过冒号前的字符串,但若某行格式异常(如内核版本差异导致空行),极易错位;推荐逐行getline+find("read_bytes:") != std::string::npos
简短安全读取逻辑:
std::ifstream io_file("/proc/1234/io");
if (!io_file.is_open()) return -1;
std::string line;
int64_t read_bytes = 0, write_bytes = 0;
while (std::getline(io_file, line)) {
if (line.find("read_bytes:") == 0) {
read_bytes = std::stoll(line.substr(11));
} else if (line.find("write_bytes:") == 0) {
write_bytes = std::stoll(line.substr(12));
}
}
权限与竞态:非 root 进程只能读自己或同组进程
Linux 默认限制:普通用户无法读取其他用户的 /proc/[pid]/io(返回 EACCES),即使目标进程与其同属一个 session。只有 root、进程自身、或满足 ptrace 权限(如通过 cap_sys_ptrace)才能跨用户读取。
这意味着你无法用一个监控程序全局采集所有进程的磁盘 I/O —— 除非以 root 运行,或改用 perf / bpftrace 等内核追踪方案(那已是另一套复杂机制)。
另外,/proc/[pid]/io 不是原子快照:两次连续读取之间,进程可能已退出、PID 被复用,或 I/O 计数器被内核更新。高频采样时建议加 usleep(10000) 避免过度轮询,也别指望毫秒级精确差值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











