add swap to ubuntu

作者:周星 发布:2017-10-07

昨天在服务器上跑 assets precompile 命令报错,最后发现是服务器内存被占满而且没有 swap 造成的,手动安装过 linux 的同学都知道,在安装 linux 系统过程中会让你指定 swap 大小,那么如何在系统安装过程后增加 swap 呢?今天我们来看一种最简单的方法。

首先我们简单来介绍一下 swap,swap 是在硬盘上的一块区域,系统可以用它来临时存储一些内存中无法存储的数据,它增加了系统工作“内存”的数据存储量,注意:只有在内存不足时才会使用到 swap。

写数据到硬盘的速度要低于保存数据到内存,操作系统偏向保存运行应用时的数据在内存中,然后使用 swap 来保存旧数据,总之,当内存不足时使用 swap 来 backup 是个不错的选择。

在我们开始增加 swap 之前,我们来看一下我们的系统是否还有足够的 swap 空间,系统可以存在多个 swap 文件或者 swap 分区,但是一般来说一个就足够了。

首先我们来看系统是否存在 swap

sudo swapon -s

如下所示:如果命令只返回了一个 header,则说明系统当前没有激活任何的 swap 空间。

Filename                Type        Size    Used    Priority

还有一种更常见的方法,就是使用 free 命令来获取系统内存的使用情况,单位为 M

             total       used       free     shared    buffers     cached
Mem:          3953        154       3799          0          8         83
-/+ buffers/cache:         62       3890
Swap:            0          0          0

我们看到了 swap total 为 0,和 swapon 命令显示的结果一致。

接下来我们要检查一下我们硬盘分区是否还有可用的空间,给 swap 分配空间的一个典型的方法是使用一个单独的分区,但是改变分区的 scheme 有时是不可行的,但是有另外的方式来达到这一目的,我们只要创建一个 swap file 然后把它放在一个已存在分区上。

首先我们来看一下我们系统当前硬盘的使用情况:

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda         59G  1.3G   55G   3% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            2.0G   12K  2.0G   1% /dev
tmpfs           396M  312K  396M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G     0  2.0G   0% /run/shm
none            100M     0  100M   0% /run/user

从第一行中可以看出系统还有 55G 的可用空间,所以系统硬盘上有大量的空间来,具体要加多少的空间给 swap,这个完全看你自己的需求,一般我们习惯设置 swap 分区为内存大小的两倍,但是我的电脑内存是 4G 的,如果分配 8G 的空间给 swap,那实在是有点奢侈,所以我只给 swap 分了 4G,总之具体情况具体分析。

现在我们知道了硬盘的使用情况,就可以创建 swap 文件了,我们需要在 root(/) 文件夹下创建一个名为 swapfile 的文件,我们在这个文件里必须分配指定大小的空间给 swap,一般有两种方法,第一种方法是使用 dd 命令创建一个预分配的空间,这种方式比较慢,另外一种是使用 fallocate 程序,相比于 dd 命令它快很多,今天我们只介绍这种方法。

fallocate 会立刻创建一个预分配大小的文件,而不需要预先往里面写填充数据。下面我们来创建一个 4G 的文件:

sudo fallocate -l 4G /swapfile

这条命令的执行时间会非常快,操作符会立刻返回,下面我们来验证一下我们这个文件的大小是否正确:

ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Apr 28 17:19 /swapfile

如你所见,文件大小为 4G,这正是我们所期望的。

接下来我们就要激活 swap 文件了,现在我们已经有了一个 4G 大小的文件,但是系统并不知道这个文件是给 swap 使用的,我们需要让系统格式化这个文件为 swap 并激活。在我们做这个事情之前,我们需要修改一下这个文件的权限,让它只可以被 root 权限的用户读取,允许其它用户读写这个文件会造成极大的安全问题:

sudo chmod 600 /swapfile

验证一下这个文件的权限

ls -lh /swapfile
-rw------- 1 root root 4.0G Apr 28 17:19 /swapfile

既然我们的 swap 文件安全了,我们可以创建 swap 空间了:

Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=e2f1e9cf-c0a9-4ed4-b8ab-714b8a7d6944

现在我们的文件已经准备好被当做 swap 空间使用了,我们来激活它:

sudo swapon /swapfile

现在我们可以来验证一下我们整个操作流程是否正确了:

sudo swapon -s
Filename                Type        Size    Used    Priority
/swapfile               file        4194300 0       -1

现在有了一个新的 swap 文件了,我们再使用 free 命令来证实一下我们的操作结果:

free -m
             total       used       free     shared    buffers     cached
Mem:          3953        101       3851          0          5         30
-/+ buffers/cache:         66       3887
Swap:         4095          0       4095

好的,我们的 swap 创建成功了,现在我们的操作系统可以在必要时使用它了!

但是当我们重启系统后,系统不会自动的激活文件,我们可以通过修改 fstab 文件来解决这一问题

sudo vi /etc/fstab

在文件的最底行加上这样一行代码来让系统自动使用我们创建的 swap 文件:

/swapfile   none    swap    sw    0   0

然后保存关闭,大功告成!

支付宝扫码赞助博主


评论(0)