第一次使用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 大小与内存的关系