在为 swap 辩护:常见的误解

主要观点:

  • 交换空间(swap)是正常运行系统的重要部分,能实现内存回收的平等性和高效性,并非仅用于应急内存。
  • 禁用交换空间不能避免内存竞争下的磁盘 I/O 问题,反而可能使磁盘 I/O 抖动从匿名页转移到文件页。
  • 4.0 之前的内核交换器有缺陷,4.0 之后情况改善。在 SSD 上,交换匿名页和回收文件页性能相当;在旧磁盘上,较低的vm.swappiness设置更合理。
  • 禁用交换空间不能避免接近内存不足(OOM)时的异常行为,且有交换空间可能会延长此过程。
  • 可利用 cgroup v2 中的memory.low等在内存压力下实现更好的交换行为并防止抖动。

关键信息:

  • 内存类型:包括负责进程代码的页(匿名页和文件页)、共享内存等,不同类型内存的回收性不同。
  • 交换空间目的:为匿名页提供存储区域,使其可按需交换出,提高物理内存使用效率。
  • 不同情况下交换空间的表现:无/低内存竞争时,有交换空间可优化内存使用;中/高内存竞争时,有交换空间更易成功回收页;临时内存使用峰值时,有交换空间更具韧性。
  • 交换空间调优:一般来说,现代内核下更多交换空间更好,但要考虑磁盘空间和交换介质特性;vm.swappiness决定回收匿名页和文件页的成本比,需测试不同值;4.20+内核有内存压力指标。

重要细节:

  • 内核进程kswapd在旧内核中对交换空间过于积极,近期已改善。
  • cgroup v2 的memory.low可让内核在内存竞争时优先从其他应用回收内存。
  • 确定内存压力使用传统 Linux 内存计数器较困难,Facebook 正在开发新指标。
  • 2012 年 Satoru Moriya 对vmscan的更改影响了vm.swappiness = 0的处理。
  • 4.20+内核有可启用的 refault 指标用于内存压力监测。
阅读 11
0 条评论