文章摘要
文章为交换空间(swap)辩护,指出其在系统内存管理中的重要性。交换空间并非仅用于应急内存,而是为了更公平高效地回收内存。禁用交换空间并不能避免磁盘I/O问题,反而可能导致更高内存争用。内核4.0版本后,交换机制有所改进,尤其在SSD上,交换匿名页和回收文件页的性能差异已不明显。
文章总结
标题:为Swap辩护:常见误解
主要内容:
本文旨在澄清关于Linux系统中Swap的常见误解,并解释其在现代系统中的重要性。以下是文章的核心观点:
Swap的重要性:Swap是系统正常运行的重要组成部分,尤其是在内存管理方面。没有Swap,合理的内存管理将变得更加困难。
Swap的真正作用:Swap的主要作用并非作为“紧急内存”,而是为了在内存回收时实现公平和高效。将其视为“紧急内存”实际上是有害的。
禁用Swap的后果:禁用Swap并不能避免在内存争用情况下的磁盘I/O问题,反而会将磁盘I/O的负担从匿名页面转移到文件页面,可能导致系统效率降低,甚至加剧内存争用。
Swap在SSD和HDD上的表现:在SSD上,Swap的性能与文件页面回收相当;而在HDD上,由于随机读取的延迟,Swap的性能较差,因此在这些设备上降低
vm.swappiness设置是合理的。Swap与OOM Killer的关系:禁用Swap并不能避免在接近内存耗尽时的异常行为,尽管Swap可能会延长这一过程。无论是否启用Swap,OOM Killer的触发结果都是相同的:系统进入不可预测的状态。
优化Swap行为:通过使用cgroup v2中的
memory.low等工具,可以在内存压力下优化Swap行为,避免内存抖动。
背景与细节:
内存类型:Linux系统中的内存分为多种类型,如文件页面(用于缓存文件数据)和匿名页面(用于程序的内存分配)。理解这些内存类型的特性是理解Swap重要性的关键。
内存回收:内存回收是指系统在不丢失数据的情况下,将某些页面从物理内存中清除。对于匿名页面,由于没有后备存储,回收会导致数据丢失,而Swap则为这些页面提供了一个后备存储,使得它们可以被回收。
Swap的真正目的:Swap的主要目的是实现内存回收的公平性,而不是作为“紧急内存”。它使得匿名页面和文件页面在内存回收时具有同等的机会,从而提高内存的使用效率。
Swap的使用场景:
低内存争用:在有Swap的情况下,系统可以交换出很少使用的匿名页面,从而优化缓存命中率;而在没有Swap的情况下,这些页面将占用内存,可能导致性能下降。
高内存争用:在有Swap的情况下,所有类型的内存都有被回收的机会,减少了内存抖动的风险;而在没有Swap的情况下,匿名页面无法被回收,增加了内存抖动的可能性。
内存使用峰值:在有Swap的情况下,系统对临时内存峰值更具弹性,但在严重内存不足时,OOM Killer的触发可能会延迟;而在没有Swap的情况下,OOM Killer会更快触发,但系统可能已经处于不健康状态。
Swap的调优:
Swap大小:在4.0以上内核中,较大的Swap空间通常更有利于系统性能。建议根据系统的工作负载进行测试,确定合适的Swap大小。
Swappiness设置:
vm.swappiness参数用于调整内存回收的优先级,较低的设置偏向于回收文件页面,较高的设置则偏向于回收匿名页面。在SSD上,设置为100(完全平等)可能效果较好;而在HDD上,建议设置为较低的值。
结论:
Swap是一个有用的工具,能够实现内存回收的公平性,但其作用常被误解。正确使用Swap可以提高系统性能,而禁用Swap并不能避免内存争用带来的问题。通过合理调优Swap,可以有效管理内存压力,避免系统进入不可预测的状态。
评论总结
评论内容总结:
关于swap的实用性:
- 支持swap的观点认为,swap在处理内存泄漏或长时间不使用的内存页时非常有用,尤其是在内存压力较大的情况下。例如,vbezhenar提到:“我总是在每台Linux电脑上创建1.5倍到4倍RAM大小的swap,从未遇到任何问题。” (I've always created swap of 1.5x - 4x RAM size on every Linux computer I've had to manage and never had any issues with it.)
- 反对swap的观点则认为,swap会延长系统在内存不足时的病理行为,导致系统响应变慢。kijin指出:“swap的存在可能会延长内存不足时的病理行为,尽早让程序崩溃反而能更快恢复系统。” (The duration of pathological behavior at near-OOM is proportional to the amount of swap you have. The sooner your program is killed, the sooner your monitoring system can detect it.)
关于OOM Killer的效果:
- 一些评论者认为,OOM Killer在实际操作中并不总是有效,无论是否启用swap,系统在内存不足时都会进入不可预测的状态。01HNNWZ0MV43FF表示:“我从未见过OOM Killer在有或没有swap的情况下真正发挥作用。” (I've never seen the OOM do its dang job with or without swap.)
- 另一些评论者则认为,尽早触发OOM Killer可以减少系统在内存不足时的痛苦。Panzerschrek提到:“在没有swap的情况下,OOM Killer杀死内存占用最多的程序后,其他程序可以继续正常运行。” (When main system memory is almost fully consumed, OOM killer kills the most memory hungry program and all other programs just continue working as before.)
关于swap的历史和现代应用:
- 一些评论者指出,swap的使用策略随着时间发生了变化,从早期的“两倍内存大小”到现代的“根据经验调整”。ggm提到:“旧模型是swap与内存大小相同,新模型是根据经验调整swap大小。” (Ancient model: twice as much swap as memory. Old model: same amount of swap as memory. New model: amount of swap your experience tells you this job mix demands.)
- 另一些评论者则认为,现代系统应该减少对swap的依赖,尤其是在内存充足的情况下。Panzerschrek认为:“swap是旧时代的遗留物,现代系统应该重新设计以在没有swap的情况下运行。” (Overall reliance on swap is noways just a legacy of old times when main memory was scarce.)
关于swap的替代方案:
- 一些评论者提到内存压缩(如zram/zswap)作为swap的替代方案,认为它在性能上更优。fpoling指出:“文章没有提到内存压缩作为swap的替代方案,现代SSD的速度甚至超过了内存压缩。” (The article has not mentioned memory compression as an alternative to swap which many Linux distributions enable by default.)
- 另一些评论者则认为,swap在某些特定场景下仍然有其价值,尤其是在处理大规模数据时。jitl分享了一个使用swap处理大规模数据的案例:“我们使用swap来处理4TB的数据计算,虽然速度较慢,但成本大幅降低。” (Using NVMe as “discount RAM” reduces the United States dollar cost of the system by 97% compared to RAM-only.)
总结:评论中对swap的实用性、OOM Killer的效果、swap的历史和现代应用以及swap的替代方案存在不同观点。支持者认为swap在处理内存压力和大规模数据时有其价值,而反对者则认为swap会延长系统在内存不足时的痛苦,现代系统应减少对swap的依赖。