Linux /proc/PID/io 怎么看进程真实磁盘读写:rchar、read_bytes 与 write_bytes 的区别
排查 Linux 服务“读写量暴涨”时,最容易被一组数字带偏:rchar 和 wchar 很大,只能说明进程通过系统调用搬运过多少字节,并不能直接等同于磁盘设备真的完成了多少读写。判断磁盘压力,要把它们和 read_bytes、write_bytes 放在一起看。
rchar/wchar是进程读写请求经过内核接口的累计量,页缓存也会让它们增长。read_bytes/write_bytes更接近块设备层实际完成的读写量,但不能代替设备级监控。- 连续采样同一个 PID,配合文件描述符、文件系统和磁盘指标,才能判断是缓存命中、回写积压还是直接 I/O。
cancelled_write_bytes变大时,要重点检查截断、覆盖和临时文件清理造成的写入抵消。

先确认四个字段到底在统计什么
执行 cat /proc/$PID/io,常见输出类似下面这样:
rchar: 184320000
wchar: 62914560
syscr: 42000
syscw: 18000
read_bytes: 4096000
write_bytes: 52428800
cancelled_write_bytes: 0
rchar 和 wchar 统计的是进程通过读写相关系统调用传递的字节数;它们会受到页缓存影响。比如文件已经在内存中,进程仍然完成了一次读取请求,rchar 会增加,但底层块设备可能没有新增读取。
read_bytes 和 write_bytes 统计的是更靠近存储层的读写量。它们适合回答“这个进程让内核实际从块设备读了多少、向块设备写了多少”,但仍是进程维度的累计计数,不能取代 iostat 或云盘监控对设备队列、延迟和吞吐的观察。
| 字段 | 适合回答 | 不能直接说明 |
|---|---|---|
| rchar / wchar | 进程向读写接口传递了多少字节 | 磁盘是否真的完成了同等读写 |
| read_bytes / write_bytes | 进程引起的块设备读写累计量 | 单次请求延迟、设备队列长度 |
| cancelled_write_bytes | 有多少写入后来被取消或抵消 | 数据是否已经安全落盘 |
用连续采样把累计值变成速率
单次查看只能看到进程从启动以来的总量。更实用的做法是保存两次读数,再除以采样间隔:
PID=2481
awk '/^(rchar|wchar|read_bytes|write_bytes|cancelled_write_bytes):/ {print}' /proc/$PID/io
sleep 5
awk '/^(rchar|wchar|read_bytes|write_bytes|cancelled_write_bytes):/ {print}' /proc/$PID/io
例如 5 秒内 wchar 增加 500 MB,而 write_bytes 只增加 40 MB,通常说明大量写入先进入页缓存,不能据此断言磁盘已经写入 500 MB。反过来,write_bytes 增长接近 wchar,并且设备延迟同步升高,才更像真实存储压力。

三组对照能快速缩小范围
rchar 很大,read_bytes 很小
优先考虑页缓存命中、重复读取同一热文件,或读取来自内存文件系统的内容。此时先看进程打开了哪些文件,再用设备级指标确认磁盘是否繁忙,不要直接扩大磁盘带宽。
wchar 很大,write_bytes 增长缓慢
这通常是写入先被缓存。要继续观察回写压力、脏页比例和文件系统空间;如果服务有明确的持久化边界,还要核对它是否主动调用了同步语义。这里别把“系统调用已经返回”当成“数据已经落盘”。
write_bytes 持续增长且 cancelled_write_bytes 也增长
检查临时文件、覆盖写和频繁截断。日志组件反复写入后又删除、缓存文件生成后立即替换,都可能让取消写入计数上升。结合 lsof -p $PID 和文件路径,通常能找到具体目录。
排查时别漏掉 PID 生命周期和 I/O 来源
服务重启后 PID 会变化,旧 PID 的累计值不能和新 PID 直接相加。记录采样时间、PID、启动时间与四个核心字段,遇到重启就开启新的一段序列。容器环境还要注意:进程看到的 PID、挂载点和设备统计口径可能与宿主机不同。
如果问题是“整块盘变慢”,还需要同时查看设备级吞吐、队列和延迟;如果问题是“某个进程读写异常”,再用 /proc/PID/io、文件描述符和路径定位。两个层级不要混为一个结论。
常见问题
read_bytes 为 0,是不是进程没有读文件?
不一定。读取可能命中页缓存,或者来自内存文件系统;先看 rchar 是否增长,再结合设备指标判断。
write_bytes 能代表数据已经持久化吗?
不能。它描述的是进程相关的块设备写入累计量,不等同于应用完成业务提交或存储设备已经安全持久化。
为什么两个进程的 write_bytes 加起来和磁盘写入对不上?
进程统计与设备统计口径不同,还可能存在内核线程、回写、元数据和文件系统放大;把进程级数据用于归因,把设备级数据用于总量验收。
如何避免把旧 PID 的数据带进新一轮统计?
每次进程启动都记录新的 PID 和启动时间,按相邻采样做差,不要跨重启直接累加。
把 rchar/wchar 当成“进程请求过多少数据”,把 read_bytes/write_bytes 当成“更接近存储层完成了多少数据”,再用连续采样和设备指标交叉核对,Linux I/O 排查会比只看一个总量可靠得多。
Python 3.14 map(buffersize) 怎么限制任务堆积:输入背压、结果顺序与停机边界
- 上一篇
- Python 3.14 map(buffersize) 怎么限制任务堆积:输入背压、结果顺序与停机边界
- 下一篇
- HTML Popover API 怎么做可关闭浮层:popover、关闭按钮与键盘回退
-
- 文章 · linux | 1天前 | Linux · DNS · 网络排查 · Linux DNS /etc/hosts getent hosts NSS 主机名解析
- Linux getent hosts 为什么和 ping 结果不一样:NSS 优先级、/etc/hosts 与 DNS 排查
- 307浏览 收藏
-
- 文章 · linux | 1天前 | Linux · 运维 · 服务配置 · Linux 服务管理器 cat-config drop-in
- Linux 服务管理器 cat-config 怎么确认最终配置:drop-in 合并、来源定位与回滚检查
- 365浏览 收藏
-
- 文章 · linux | 3天前 |
- Linux journalctl 怎么按时间回放服务故障:unit、boot 与 invocation 三层核对
- 200浏览 收藏
-
- 文章 · linux | 3天前 |
- Linux 严格只读隔离后配置写不进去:ReadWritePaths、RuntimeDirectory 与回滚检查
- 185浏览 收藏
-
- 文章 · linux | 3天前 | Linux · psi · 服务治理 · system · 内存压力 · Linux PSI systemd-oomd ManagedOOMMemoryPressure oomctl
- systemd-oomd 怎么配:用 PSI 提前回收高压服务并验证候选 cgroup
- 452浏览 收藏
-
- 文章 · linux | 3天前 |
- Linux ConditionPathExists 条件服务为何显示 skipped:unit 状态与日志验收
- 119浏览 收藏
-
- 文章 · linux | 3天前 | Linux · 磁盘 · 故障排查 · 文件系统 · 挂载 · Linux find du -xdev bind mount mountpoint
- Linux find -xdev 排查目录为何越过挂载点:du 与 bind mount 的边界
- 416浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 5191次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4702次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4654次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4916次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4867次使用
-
- 详解golang执行Linuxshell命令完整场景下的使用方法
- 2023-01-07 426浏览
-
- go程序部署到linux上运行的实现方法
- 2023-01-02 387浏览
-
- Linux系统下Go语言开发环境搭建
- 2023-01-07 242浏览
-
- 使用golang获取linux上文件的访问/创建/修改时间
- 2022-12-31 238浏览
-
- 在Linux系统中安装Go语言的详细教程
- 2022-12-29 402浏览

