这两天正在部署短链接项目,我所买的服务器是 2c4g,以为其绰绰有余,且过让人大跌眼镜,在启动服务之后便发现其内存直接爆满,导致服务器卡死。在准备买 4c8g 服务器之时,我偶发现了使用交换空间解决服务器内存不足的问题,确实有很大改善,现将步骤总结于此。

检查系统的 Swap 信息

首先我们需要检查系统的存储,看看是否已经配置过 swap。一个系统可以设置多个 swap 文件或分区,不过一般来说一个就够了。

使用swapon命令可以检查系统是否已经配置过swap,这是一个通用的swap工具。使用-s标签可列出当前存储设备上的swap使用情况:

1
swapon -s

如果该命令没有返回出结果,则代表该系统尚未配置过 swap。

或者,我们也可以使用free工具来查看系统的整体内存使用情况,这里可以看到内存和swap的使用状态(显示单位为MB):

1
free -m

检查可用的存储空间

通常,我们建立一个单独的分区作为 swap。然而有时候由于硬件或软件的限制,新建分区的方式无法实现,这种情况下就可以建立一个 swap 文件来实现同样的功能。

开始之前,先检查一下磁盘的可用空间。输入如下指令:

1
2
3
4
5
6
7
8
df -h

Filesystem Size Used Avail Use% Mounted on
/dev/vda1 59G 1.5G 55G 3% /
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 8.3M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup

这里的 -h 标记是为了告诉 dh 将信息输出为对人类友好的格式,比如以 MB 或 GB 为单位输出空间使用和空余情况,而不是直接输出内存块的个数。

从第一行可以看到我们的存储分区上还有59GB的空间剩余,这足够我们操作了。(我这是一台中等规模的新建云主机,每个人的情况可能有很大不同。)

合适的swap空间是多大?

关于这个问题有很多种选择,这取决于你的应用需求和你个人的偏好。一般来说,内存容量的两倍就是个不错的起点。

我的系统内存有4GB,如果设置8GB的swap会占据太多空间,所以我决定只设置4GB就好。

创建 Swap 文件

接下来我们将在文件系统上创建 swap 文件。我们要在根目录(/)下创建一个名叫 swapfile 的文件,当然你也可以选择你喜欢的文件名。该文件分配的空间将等于我们需要的 swap 空间。

最快捷的创建方式是fallocate命令,该命令能够创建一个预分配指定大小空间的文件。输入如下指令创建一个4GB的文件:

1
sudo fallocate -l 4G /swapfile

输入密码后,该swap文件将立即创建完毕。我们可以用ls命令检查文件大小:

1
2
3
ls -lh /swapfile

-rw-r--r-- 1 root root 4.0G Oct 30 11:00 /swapfile

至此,Swap 文件创建完毕。

启用 Swap 文件

现在我们已经有了 swap 文件,但系统还不知道应该使用该文件作为 swap,这就需要我们告知系统将该文件格式化为 swap 并启用起来。

首先我们需要更改swap文件的权限,确保只有root才可读,否则会有很大的安全隐患。使用chmod命令进行权限操作:

1
sudo chmod 600 /swapfile

如此,该文件的读写都只有root才能操作。使用ls -lh命令检查一下:

1
2
3
ls -lh /swapfile

-rw------- 1 root root 4.0G Oct 30 11:00 /swapfile

然后,使用如下命令告知系统将该文件用于swap:

1
2
3
4
sudo mkswap /swapfile

Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=b99230bb-21af-47bc-8c37-de41129c39bf

现在,这个swap文件就可以作为swap空间使用了。输入如下命令开始使用该swap:

1
sudo swapon /swapfile

我们可以输入如下命令来确认一下设置是否已经生效:

1
2
3
4
swapon -s

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

再使用 free 命令来看一下:

1
2
3
4
5
6
free -m

total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 4095 0 4095

至此,我们的swap已经设置完毕,操作系统会在需要的时候使用它。

使 Swap 文件永久有效

至此我们已经在系统中启用了 swap 文件,然而一旦系统重启后,服务器还不能自动启用该文件。要让系统在重启后自动生效 swap,我们可以通过修改 fstab 文件来实现(这是一个管理文件系统和分区的表)。

用sudo权限打开该文件编辑:

1
sudo nano /etc/fstab

在文件末尾加入下面这行内容,告诉操作系统自动使用刚才创建的swap文件:

1
/swapfile   swap    swap    sw  0   0

添加完毕后,保存退出。以后服务器每次重启都会检查该文件并自动启用swap。