本文介绍了Linux系统中swap空间的相关概念及应用,通过实践介绍了实际使用中的操作流程和注意事项。

什么是Swap

我们都知道计算机系统在运行的时候会使用到 RAM(Random Access Memory),当只有少数应用程序在运行时,系统会使用可用的RAM进行管理。

但是如果有很多很多的程序在运行,那么就需要非常大容量 RAM ,这时候计算机 RAM 不够,应用程序就会崩溃。

当RAM耗尽时,Swap交换空间会被系统使用。当RAM耗尽时,Linux系统使用部分硬盘内存并将其分配给正在运行的应用程序。

这听起来非常不错,这意味着如果我们如果分配50GBSwap交换空间,系统或许可以同时运行成百上千的应用程序?是这样么?大错特错!!!

你知道的,程序运行速度十分重要;
RAM 访问数据的大小为纳秒级;
SSD 访问数据(以微秒为单位),而普通硬盘以毫秒为单位访问数据;
这意味着 RAM 比 SSD 快 1000 倍,比普通HDD快100,000倍。

如果应用程序过分依赖 Swap 交换空间,则其性能将下降,因为它无法以与RAM中相同的速度访问数据。
因此,完成相同任务可能需要几分钟才能完成任务,而不需要花费1秒钟完成任务。这将使应用程序几乎无用。这被称为计算术语中的颠簸。

Swap 交换空间只是用来应急的,所以它的分配要适量。

为什么需要 Swap 交换空间

  • 如果系统的 RAM 小于1GB,就必须使用 Swap 交换空间,不然没运行几个应用程序,他们就会崩溃。
  • 如果系统运行了非常重的应用程序,例如视频制作软件,使用 Swap 交换空间可以防止因为 RAM 空间不够用导致的软件崩溃。
  • 如果电脑休眠了,断电 RAM 会被断电; RAM 没有断电记忆功能,因此要将这些内容暂时存入 Swap 交换空间里,当从休眠中恢复过来的时候,这些内容会被重新读入 RAM ,保证程序继续运行。
  • 为了避免有些程序疯狂的吃掉很多内存,这个时候需要 Swap 来帮助我们规避这些风险。

当 RAM 很大的时候,需不需要分配很大的交换空间?

如果你的 RAM 有32GB或者64GB,你的系统可能永远都不会使用到这么多的交换分区。

我猜测,如果你的系统有32GB的 RAM ,它或许至少有100GB的硬盘。
分配几GB的交换空间应该也无关痛痒,如果错误的程序开始滥用 RAM ,它将提供额外的“稳定性”。

应该分配多大的 Swap 交换空间?

现在回到这个最大的问题上,应该给Linux分配多少 Swap 空间才够。
答案是没有一个确切的答案,不过倒是有一些建议,不同的人根据自己的实际情况分配交换空间的大小。

如果根据 Red Hat 的建议,他们建议是分配 RAM 20% 的交换空间,比如RAM是 8GB,分配 1.6GB 交换空间。

CentOS建议

  • 如果RAM小于2GB,就分配和RAM同等大小的Swap交换空间。
  • 如果RAM大于2GB,就分配2GB交换空间

Ubuntu考虑到系统需要休眠

  • 如果RAM小于1GB,Swap空间至少要和RAM一样大,甚至是要为RAM的两倍大小。
  • 如果RAM大于1GB,Swap交换空间应该至少等于RAM大小的平方根,并且最多为RAM大小的两倍。
  • 如果要休眠,Swap交换大小应该等于RAM的大小加上RAM大小的平方根。

Ubuntu建议的Swap分配表

Ram大小Swap大小激活Swap后合计大小
256MB256MB512MB
512MB512MB1GB
1GB1GB2GB
3GB2GB5GB
4GB2GB6GB
6GB2GB8GB
8GB3GB11GB
12GB3GB15GB
16GB4GB20GB
32GB6GB38GB
64GB8GB72GB
128GB11GB139GB

事实上没有一个真正确定的Swap交换空间分配大小,根据实际情况来吧,如果你不在乎多点交换空间,可以使用两倍于RAM的这种方案。

如何扩展 Swap 分区

Ubuntu 扩展 Swap 分区的流程

首先用命令free查看系统内 Swap 分区大小。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       3.4Gi       1.7Gi       9.0Gi        10Gi       2.4Gi
Swap:         947Mi          0B       947Mi

其中 Swap 只有947 M,机器是阿里云的,经过多次升级,2C4G 升级到了 8C16G ,系统没有重装,因此Swap配置不太合理,我们按照Ubuntu推荐将 Swap 分区增大4G。

创建一个 Swap 文件

找一个空间足够的目录用来存放Swap文件,比如我用/根目录:

  • 创建文件夹,切换到指定目录,创建指定大小的文件
$ sudo mkdir /swap
$ cd /swap
$ sudo dd if=/dev/zero of=swapfile bs=1K count=4M
4194304+0 records in
4194304+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 32.3362 s, 133 MB/s

dd命令参数if为输入文件名,of为输出文件名,bs为单次读取和写入的字节数,count为拷贝的次数,因而总文件大小为bs*count

  • 把生成的文件转换成 Swap文件
$ sudo mkswap -f swapfile

激活 Swap 文件

$ sudo swapon swapfile
swapon: /swap/swapfile: insecure permissions 0644, 0600 suggested.

再次查看内存情况

$ free -h

              total        used        free      shared  buff/cache   available
Mem:           15Gi       4.6Gi       153Mi       9.0Gi        10Gi       1.2Gi
Swap:         4.9Gi       1.0Mi       4.9Gi

如果需要一直保持这个 swap ,可以把下面这行命令追加在 /etc/fstab 文件中。

sudo vim /etc/fstab
/swap/swapfile /swap swap defaults 0 0

卸载这个 Swap 文件

进入建立的 swap 文件目录。执行下列命令。

$ sudo swapoff swapfile

参考文献

相关文章

Q.E.D.