Azure Ubuntu服务器经常卡死的解决方法

第一次使用Microsoft Azure的VM服务器,Ubuntu系统,但是使用一段时间就是无缘无故的死机,只有重启之后才恢复。一开始以为配置太低,后来将配置升级了两个档次之后依然如故。偶然间在V2EX上查到了也有人吐槽,后来才发现Azure VM竟然默认没有分配swap分区,虚拟内存不足会导致机器卡死。

登录VM,使用 free -m 命令,发现结果中 Swap 总数是0,然后使用 sudo swapon --show 命令发现结果是空白的,正常应该会列出SWAP分区或SWAP文件的大小,如果输出是空的则表示系统尚未启用SWAP空间。

因为VM设置交换分区比较麻烦,于是可以通过创建SWAP文件的方式来设置交换空间。

创建并激活SWAP文件

首先创建一个指定大小的swap文件,有两种方法:

方法一:使用下面的命令创建:

sudo fallocate -l 4G /swapfile

可以直接设定容量大小。

方法二:使用下面的命令创建一个空白的文件:

sudo dd if=/dev/zero of=/swapfile bs=1G count=4

其中 /dev/zero 是 Linux 系统中的一个特殊块设备,在每次读取时输出零字节,bs参数设置单个count的单位大小,上面的命令设置成1G,那么后面的count值就是4G的意思。

方法一更加简洁。可以根据自己VM的配置进行调整,可以按下面的规则:

  • 内存 <= 4G:Swap 至少 4G
  • 内存 4~16G:Swap 至少 8G
  • 内存 16G~64G:Swap 至少 16G
  • 内存 64G~256G:Swap 至少 32G

然后使用下面的命令设置文件权限:

sudo chmod 600 /swapfile

将文件格式化为SWAP空间并将其添加到交换池之中:

sudo mkswap /swapfile
sudo swapon /swapfile

最后将swapfile路径内容写入到 /etc/fstab 文件中让SWAP空间永久生效:

/swapfile swap swap defaults 0 0

这个时候使用 sudo swapon --show 命令可以看到SWAP文件生效了。

可以使用下面的命令查看Swappiness的值,该值用于定义Linux系统使用SWAP空间的频率,范围是0到100,数字越高Linux会更加积极的使用SWAP空间。

cat /proc/sys/vm/swappiness

对于Server来讲建议设置成80,使用下面的命令:

sudo sysctl vm.swappiness=80

可以在 /etc/sysctl.conf 文件中添加下面的内容使其重启后自动生效:

vm.swappiness=80

调整SWAP文件大小

首先将其从交换池中移除:

sudo swapoff /swapfile

重新设置文件大小:

sudo dd if=/dev/zero of=/swapfile bs=1G count=8 oflag=append conv=notrunc

重新将文件格式化为SWAP空间并将其添加到交换池之中:

sudo mkswap /swapfile
sudo swapon /swapfile

删除SWAP文件

首先使用下面的命令停用SWAP文件:

sudo swapoff -v /swapfile

然后在 /etc/fstab 文件中删除 swap 相关的行。
最后执行下面的命令删除swapfile文件:

sudo rm /swapfile

参考:
这 Azure 是先天营养不良吗?
如何在 Ubuntu 中创建、删除和调整 SWAP 空间
Linux 中 Swap 交换分区设置教程,以及 Swap 大小与内存的关系

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注