来自内核计数器的进程级磁盘占用实况

iotop 能看出是哪个进程在烧磁盘

磁盘突然飙升却找不到明显的写入者时,iotop 把吞吐直接指回那个在捣乱的进程。系统级工具只给症状——await 高、util 打满——不给嫌疑人:五十个进程共享磁盘,平均值平等地怪每一个。终结调查的永远是按进程的问题——谁、多少、何时开始——iotop 从内核计数器实时回答,应用藏都没处藏。 把它放在系统级视图旁边,而不是代替。iostat 或 vmstat 说磁盘是瓶颈,iotop 点名是谁造成的。两者合起来把存储悬案压成两条命令:确认资源,锁定消费者。 逐个进程的计数器 iotop 从内核读每个进程的 IO,于是实时读写速率能对应到一个 pid,而不是一个说不清来源的负载均值。加 -o 只显示真正在做 IO 的进程,一眼看清。默认视图读写分开,还带 swap-in 百分比,把真吃磁盘的和仅仅在场的分开——DISK READ 高、写零的是在扫,写高的在产; throttle、迁移还是杀,取决于这个区分。 注意计数器量的到底是什么:穿过 IO 层的按进程字节,含还没落盘的缓冲写。进程写速率巨大、磁盘看着却闲(页缓存吸收),或速率平平、磁盘打满(大量小同步写),都可能。iotop 跟设备 util 一起读:进程侧定罪加设备侧饱和才是完整画面,任一半单独都误导。 看到谁在扫盘 按带宽排序,那个罪魁就现形了,无论是日志囤积、索引器还是失控备份。跟住这个 pid,就能定位到确切的进程(往往还有文件),再动手不迟。惯犯名单:debug 级别没轮转的日志、排在高峰的重建索引、同盘读写备份、坏镜像上循环解包的容器层。修法各不同——轮转、改期、分开、清理——杀进程治标,病因明天定时再来。 动手前把 pid 解析到完整上下文:命令行、工作目录、lsof 看开文件、父进程。一个烧写的 java 进程背后可能是一个 PID 命名空间里的十个应用;修要修对那一个。先定罪后动手——每个以遗憾收场的存储 war story 都跳过了第一步。 ...

三月 15, 2028 · 1 分钟 · XB Field Notes
内核里把 I/O 合并与重排、以换取更高吞吐或更公平的内核队列。

磁盘调度器给 I/O 排好队,让磁头移动更省

blk-mq 给块层准备了两级队列:每个 CPU 一个软件暂存队列,每条设备队列一个硬件派发队列,而 I/O 调度器就夹在两者之间。一个请求会走最短路径——直接进硬件队列——除非该设备挂了调度器,或者这个请求还能被合并;这两种情况下它要先在软件队列里停留。调度器是整个栈里唯一由内核决定“请求以什么顺序到达设备”的地方。 排序在机械盘上价值极大,在闪存上几乎为零,但调度器还有第二件活,而且这件事在 NVMe 时代依然存在:决定谁先等、谁后等。这两件事的方向并不一致——为磁头效率而重排根本不关心公平,而公平本身要付出寻道的代价——所以当前内核里的四种调度器不是拿来排名的,而是拿来匹配设备与负载的。 磁头才是预算 在 7200 RPM 的盘上,平均每个请求的旋转开销是 4.17 ms,传输一个 4 KiB 块只要 0.026 ms,所以几乎全部服务时间都是寻道加旋转。fixture 重放了 2000 个随机 4 KiB 读、覆盖 100000 条磁道:按到达顺序派发时磁头走过 67907411 条磁道、整轮耗时 21954 ms,约 91 IOPS;按磁道升序派发时只走 99977 条、耗时 8645 ms,约 231 IOPS。同样的请求、同样的设备,磁头行程少了 679 倍,吞吐涨了 2.5 倍。 ...

三月 9, 2027 · 1 分钟 · XB Field Notes