Linux 需要 Swapping的必要性
|
正是因为 Linux 上的所有进程都会通过虚拟内存这一层抽象间接与物理内存打交道,而 Swapping 也充分利用了该特性,它能够让应用程序看到操作系统内存充足的假象,然而并不知道它使用的部分虚拟内存其实在磁盘上,因为内存和磁盘的读写速度上的巨大差异,这部分虚拟内存的读写非常缓慢,我们在 为什么 CPU 访问硬盘很慢 曾经介绍过: 在 SSD 中随机访问 4KB 数据所需要的时间是访问主存的 1,500 倍,机械磁盘的寻道时间是访问主存的 100,000 倍[^2] 如此巨大的性能差异使得触发 Swapping 的进程可能会遇到性能损失,同一个页面的频繁换入换出会导致极其明显的性能抖动,如果没有相应的背景知识,遇到类似的问题可能会很难查到根本原因,例如 MySQL 在错误配置 NUMA 时就会出现内存页频繁换入换出,影响服务质量的问题。 Linux 提供了两种不同的方法启用 Swapping,分别是 Swap 分区(Swap Partition)和 Swap 文件(Swapfile):
Swap 分区的大小是需要系统管理员手动设定的,然而不同的场景最好设置不同交换分区大小,例如:桌面系统的交换分区大小可以是系统内存的两倍,这可以让我们同时运行更多的应用程序;服务器的交换分区应该关闭或者使用少量的交换分区,不过一旦启用交换分区,就应该引入监控监控应用程序的性能。 我们到现在已经对 Linux 上的 Swapping 有了一定的了解,接下来回到这篇文章想要讨论的问题 — 『为什么 Linux 需要 Swapping』,我们将从以下两个方面介绍 Swapping 解决的问题、触发入口和执行路径: Swapping 可以直接将进程中使用相对较少的页面换出内存,立刻给正在执行的进程分配内存; Swapping 可以将进程中的闲置页面换出内存,为其他进程未来使用内存做好准备; 内存不足 当系统需要的内存超过了可用的物理内存时,内核会将内存中不常使用的内存页交换到磁盘上为当前进程让出内存,保证正在执行的进程的可用性,这个内存回收的过程是强制的直接内存回收(Direct Page Reclaim)。 总结 很多人认为当系统内存不足时应该立即触发内存不足(Out of memory、OOM)并杀掉进程,但是 Swapping 其实为系统管理员提供了另外一种选择,利用磁盘的交换空间避免程序被直接退出,以降低服务质量的代价换取服务的部分可用性。Linux 中的 Swapping 机制主要是为内存不足和内存闲置两种常见的情况存在的
关于是否应该开启 Swapping 的讨论其实非常多,我们在今天也不应该一刀切地认为必须开启或者禁用 Swapping,我们仍然需要分析场景并利用好 Linux 为我们提供的这一机制,例如 Kubernetes 要求禁用 Swapping,我们就应该遵循社区提出的建议,在部署 Kubernetes 的机器上关闭这一特性[^3]。到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:
如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。 (编辑:三门峡站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


