背景

最近,我在使用腾讯云 2 核 2G 的轻量服务器运行我的个人网站时,发现网站总是莫名其妙的宕掉,去服务器查看,容器莫名其妙的停止运行,甚至有时候服务器无响应,都无法 ssh 登录,只能在腾讯云强制重启解决。

查了一些资料,感觉核心还是在于服务器的内存太小,与此同时,腾讯云的服务器默认没有配置任何虚拟内存(也就是交换空间),作为一个资源本就有限的轻量服务器,没有交换空间,可能确实有点难为它了。

解决方案:配置交换空间

在 Linux 系统中,当物理内存不足时,系统性能可能会受到影响,甚至导致系统崩溃。为了避免这种情况,可以创建交换空间(Swap Space)来帮助系统将部分数据存储在磁盘上,从而缓解内存压力。虽然交换空间并不能真正增加服务器的物理内存,但它可以在内存吃紧时提供一个 " 缓冲区 ",有效防止系统因内存耗尽而崩溃。

下面,就记录分享下我这边的配置过程

步骤 1:检查当前状态

首先,需要确认服务器当前的交换空间状态。有两个命令可以用来查看:

sudo swapon --show
free -h

其中, swapon --show 可以显示当前启用的交换空间信息,包括设备名称、类型、大小等 free,可以显示内存和交换空间的使用情况。

果然,默认状态下,swapon --show 没有显示任何输出,而 free -h 显示 Swap 行的所有值都是 0。即当前服务器确实没有配置交换空间。

步骤 2:创建交换文件

考虑到我的服务器只有 2G 内存,我决定创建 4G 的交换空间(查了资料,一般配置物理内存的 2 倍),使用了以下命令:

sudo fallocate -l 4G /swapfile

如果你的系统不支持 fallocate,可以使用 dd 命令作为替代:

sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

这里,bs=1M 指定块大小为 1MB,count=4096 指定写入 4096 个块,总共创建 4GB 的文件。

步骤 3:设置文件权限

为了确保系统安全,我们需要限制交换文件的访问权限,只允许 root 用户访问

sudo chmod 600 /swapfile

这个命令将文件权限设置为只有文件所有者(root)可以读写。

步骤 4:格式化交换文件

接下来,需要将这个文件格式化为交换空间:

sudo mkswap /swapfile

此命令会将/swapfile 初始化为交换空间。 执行后,应该可以看到控制台有类似下面的输出:

Setting up swapspace version 1, size = 4 GiB (4294967296 bytes)
no label, UUID=89d860f9-a278-4a76-855b-d33c4778a880

步骤 5:启用交换空间

格式化完成后,是时候启用这个新创建的交换空间了:

sudo swapon /swapfile

步骤 6:验证配置

为了确保交换空间已经成功启用,我们可以使用以下命令进行验证:

sudo swapon --show

输出:

NAME      TYPE  SIZE USED PRIO
/swapfile file   4G   0B   -2

使用 free 命令查看

free -h

输入如下:

              total        used        free      shared  buff/cache   available
Mem:           31Gi       3.7Gi        24Gi       0.0Ki       3.6Gi        27Gi
Swap:         4.0Gi          0B       4.0Gi

步骤 7:设置开机自动挂载

最后,为了确保每次重启服务器后交换空间都能自动启用,编辑了 /etc/fstab 文件:

sudo nano /etc/fstab

在文件末尾,添加一行:

/swapfile none swap sw 0 0

保存并关闭文件。这样,每次系统启动时都会自动启用这个交换文件。

取消交换空间

如果出于某些原因,您不再需要之前创建的交换空间,可以按照以下步骤进行取消:

  1. 禁用交换空间:
sudo swapoff /swapfile
  1. 删除交换文件:
sudo rm /swapfile
  1. 更新 /etc/fstab 文件:

再次编辑 /etc/fstab 文件,找到并删除或注释掉之前添加的行:

#/swapfile none swap sw 0 0

保存并关闭文件。

总结

虽然增加交换空间并不能从根本上解决内存不足的问题,但对于像我这样使用轻量级服务器的用户来说,它确实是一个有效的临时解决方案。目前网站已经连续运行两星期了,再继续观察观察。