Linux 交换空间有什么用
2020年8月25日背景:我平时开发都是用 Linux,很少用 Windows 去开发,因为感觉 Windows 下开发用起来不够顺手,也常常给身边的人安利 Linux 系统。目前用 Manjaro,有 Archlinux 做靠山,文档、使用人数都很足,让我很满意。之前每次给自己或别人安装 Linux,都要考虑一个叫 Linux 交换空间的问题,要不要设,以及设成多大?最近我就深深体会到交换空间的重要性。

我的电脑只有 8 G内存,在很久之前给自己安装的系统是没有设立交换空间的,听从网上某些教程,什么 4 G 内存设个交换空间,8G内存用不到交换空间。然而事实是 8 G内存对我来说完全不够用,IDE、Chrome、VSCode 一打开,再开好几个服务进程,内存就炸了,而当内存不够时,Linux 会陷入死机状态,什么也干不了,只能强制关机重启。
在内存不够用的情况下,就很有必要设立交换空间了。因为操作系统会利用虚拟内存技术,通过把进程换出到辅存(就是硬盘),在需要时再从辅存上换入到内存,来达到扩充内存空间的作用。
交换空间-交换技术原理
从操作系统的虚拟内存说起。
虚拟内存是一个抽象的概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。
《深入理解计算机系统(第三版)》
计算机的储存器由主存(或者说内存)和外存(或者说辅存,即通常的机械硬盘、固态硬盘等)组成。程序和数据必须装入内存中,才能被 CPU 调度执行。
虚拟内存可以简单理解成运行进程可以使用的内存和磁盘空间的组合。而交换空间是硬盘上虚拟内存的一部分,当内存满时使用。它通过交换(swapping)方式,由操作系统把哪些在内存中处于等待状态(或在 CPU 调度原则下被剥夺运行权利)的进程和数据从内存换出(swap out)到外存的交换区,而把那些等待事件已经发生、处于就绪态的进程和数据从外存换入(swap in)到内存中。
简单讲,就是通过交换技术来达到内存的扩充。而 Linux 使用交换空间来增加主机可用的虚拟内存(虚拟内存不等于同交换空间,也不等同于内存)。
这样也会带来新的问题,因为内存的存取速度是在纳秒级别的,而固态硬盘(SSD)是在微秒级别,机械硬盘(HDD)是在毫秒级别,这意味着内存要比固态硬盘快 1000+ 倍,比机械硬盘快 1000+ 倍。比当内存严重不足时,系统会频繁使用调页和交换,这增加了磁盘 I/O 的负载。进一步降低了系统对作业的执行速度,即系统 I/O 资源问题又会影响到内存资源的分配。
这个缺点,简单说,就是不能太依赖交换空间,少量使用是有好处的,只会在一定程度上使系统缓慢,而如果不用交换空间,内存又不够的话,就直接死机了。如果有条件,直接加内存再好不过了。
至于有些文章说当系统内存不够时,会触发 Linux 中的 OOM(Out Of Memory Killer)机制,这个机制是为了防止当系统物理内存不够用的时候系统崩溃,而选择一个占用内存最高的程序,把它 Kill 掉。这个情景我还没遇到过,我遇到的都是鼠标键盘完全失去响应,图形桌面动不了,只能直接按电源键强制重启。
Linux 交换空间类型
Linux 提供两种类型的交换空间:交换分区(swap 分区)和交换文件(swap 文件)。一般交换分区在安装系统时就设立了,后期也可以通过分区补上一个交换分区,而交换文件在后期的添加更方便,不用涉及到磁盘分区。
通过执行 swapon 命令可以查看当前交换空间的大小:
[shiyang@dr ~]$ swapon NAME TYPE SIZE USED PRIO /dev/sdb6 partition 8.6G 1.1G -2
交换空间的大小应该设成多大?
其实这个问题我想应该没有确切定义,很难说多大更好,只能说是提供一些建议。在很长时间里都被建议为两倍或两倍以下即可。如果还不够用,不如直接增加内存大小,毕竟内存的存取速度是远远大于硬盘的存取速度,增加内存可以带来更好的体验。也可以不设交换空间,像我之前安装一样,但在内存够用的情况下还好,如果不够用,就会死机了,所以还是应该要设立一个交换空间,以备不时之需,毕竟,同样的储存大小里,硬盘的价格是远远小于内存的价格。
在红帽的博客里,是建议为内存大小的 20%。
而在 CentOS 的安装手册里。则是根据内存大小提供不同建议,并且是建议都要有一个交换空间,我当初安装时以为 8 GB 够用,就没有设,还是太天真。 下表是 CentOS 安装手册的介绍:
系统内存容量 | 建议大小 | 如果需要休眠 |
小于 2 GB | 内存的两倍 | 内存的三倍 |
2GB – 8GB | 与内存大小一致 | 内存的两倍 |
8GB – 64GB | 在 4 GB到内存大小的一半之间 | 内存的 1.5 倍 |
超过 64 GB | 根据实际需求来定(至少4 GB) | 无建议 |
参考资料:
- 《深入理解计算机系统(第三版)》
- An introduction to swap space on Linux systems:https://opensource.com/article/18/9/swap-space-linux-systems
- How Much Swap Should You Use in Linux? :https://itsfoss.com/swap-size/
- 红帽博客:https://www.redhat.com/en/blog/do-we-really-need-swap-modern-systems
- Centos 安装手册:https://docs.centos.org/en-US/centos/install-guide/CustomSpoke-x86/#sect-recommended-partitioning-scheme-x86