Hacker News 中文摘要

RSS订阅

为互换辩护:常见误解(2018) -- In defence of swap: common misconceptions (2018)

文章摘要

文章为交换空间(swap)辩护,指出其在系统内存管理中的重要性。交换空间并非仅用于应急内存,而是为了更公平高效地回收内存。禁用交换空间并不能避免磁盘I/O问题,反而可能导致更高内存争用。内核4.0版本后,交换机制有所改进,尤其在SSD上,交换匿名页和回收文件页的性能差异已不明显。

文章总结

标题:为Swap辩护:常见误解

主要内容:

本文旨在澄清关于Linux系统中Swap的常见误解,并解释其在现代系统中的重要性。以下是文章的核心观点:

  1. Swap的重要性:Swap是系统正常运行的重要组成部分,尤其是在内存管理方面。没有Swap,合理的内存管理将变得更加困难。

  2. Swap的真正作用:Swap的主要作用并非作为“紧急内存”,而是为了在内存回收时实现公平和高效。将其视为“紧急内存”实际上是有害的。

  3. 禁用Swap的后果:禁用Swap并不能避免在内存争用情况下的磁盘I/O问题,反而会将磁盘I/O的负担从匿名页面转移到文件页面,可能导致系统效率降低,甚至加剧内存争用。

  4. Swap在SSD和HDD上的表现:在SSD上,Swap的性能与文件页面回收相当;而在HDD上,由于随机读取的延迟,Swap的性能较差,因此在这些设备上降低vm.swappiness设置是合理的。

  5. Swap与OOM Killer的关系:禁用Swap并不能避免在接近内存耗尽时的异常行为,尽管Swap可能会延长这一过程。无论是否启用Swap,OOM Killer的触发结果都是相同的:系统进入不可预测的状态。

  6. 优化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,可以有效管理内存压力,避免系统进入不可预测的状态。

评论总结

评论内容总结:

  1. 关于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.)
  2. 关于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.)
  3. 关于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.)
  4. 关于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的依赖。