主要观点:
- 交换空间(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 指标用于内存压力监测。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。