背景
swap slot cache 被移除(0ff67f990bd4,为简化代码)后,hibernation 一并改走 swap slot 的慢分配路径。出发点是简化,却没给 hibernation 单独留一条快路径。
┌──────────────────────────────────┐
│ 移除交换槽缓存后,休眠改走慢分配 │
└────────────────┬─────────────────┘
▼
┌──────────────────────────────────┐
│ 慢分配频繁轮换簇 │ 分配变慢、数据分布更随机
└────────────────┬─────────────────┘
▼
┌──────────────────────────────────┐
│ 部分设备出现性能回归 │ 用户报告休眠耗时数百秒
└──────────────────────────────────┘
慢分配路径在普通场景下开销可接受,但 hibernation 要一次性分配大量连续的 swap slot。慢分配为腾空间频繁轮换 cluster,不仅分配本身变慢,还让写入数据分布更随机。在部分设备上,这个组合把 hibernation 的耗时推高了不少。
问题
- 移除交换槽缓存后休眠改走慢分配
- 慢分配频繁轮换簇,分配变慢
- 数据分布更随机,加剧写入碎片
- 部分设备休眠耗时大幅回归
方案
核心是给 hibernation 单独实现快分配:快分配并不复杂,只是当初为简化没做。
旧:休眠走慢分配
┌──────────────────────────────┐
│ 每次分配都走慢路径 │
└──────────────┬───────────────┘
▼
┌──────────────────────────────┐
│ 频繁轮换簇,分配慢、分布随机 │
└──────────────────────────────┘
新:休眠走快分配
┌────────────────────────┐
│ 为休眠实现快分配 │
└───────────┬────────────┘
▼
┌────────────────────────┐
│ 不再频繁轮换簇,分配快 │ 快分配并不复杂,只是之前为简化没做
└────────────────────────┘
有了快路径,hibernation 不再为每个 slot 走慢路径、不再频繁轮换 cluster。分配快了,数据也写得更连续,写入侧的开销随之下降。
收益
作者引用性能数据(Samsung SSD 830 Series,SATA II 3.0 Gbps):
| 指标 | 6.19 基线 | 应用本系列后 | 变化 |
|---|---|---|---|
| hibernation 耗时 | 324 秒 | 35 秒 | 快约 9 倍 |
作者说明 "performance is several times better"。这台 SATA II SSD 上,hibernation 从 324 秒缩短到 35 秒,提升约 9 倍。