脏页大小 - 18446744073709551614 ?!
分享一个 etcd-io/etcd@17615 问题:用户发现 etcd 进程写入 WAL 日志有抖动,但是磁盘压力并不大,而且 fsync 系统调用都很正常; 后来通过 Tracing 工具定位到了内核 memory-cgroup 脏页数据统计有问题,不过该问题仅会出现在 v5.15.0-63 小版本。 17615 问题单里有详尽的定位过程,推荐看看。 因为这个问题,我翻阅了相关的内核 PATCH 邮件,做了以下的脏页分配限流 (简单) 总结。 脏页分配限流 - balance_dirty_pages 回写 (Writeback) 是指内核负责将脏页 (DirtyPage) 刷入存储设备上,它涉及到脏页分配控制。 在 v4.2 版本之前,脏页分配更多是由 memory-cgroup 来控制;而脏页流控核心 - balance_dirty_pages - 根据全局的脏页水位情况来决定是否需要控速。 在 LinuxCon Japan 2015 会议上,内核开发者 Tejun Heo 认为,在没有感知到全局脏页水位的情况,memory-cgroup 无法对脏页进行有效的控制。 核心 balance_dirty_pages 函数通过 vm.dirty[_background]_{ratio, bytes} 参数来计算全局脏页的水位上限。 Tejun Heo 认为普通的 memory-cgroup 也应采用同样的方式来计算组内的脏页水位上限,而根组 memory-cgroup 只不过是退化到全局模式,当然全局脏页的水位优先级更高。 NOTE: balance_dirty_pages_ratelimited 会调用 balance_dirty_pages。 在 writeback: cgroup writeback support PATCH 合并到 v4....