背景

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 倍。