/ ecs

swap

服务器最近总是死机,分析了下系统才发现内存过于紧张。阿里云默认没有 swap,需要手动添加。

开始之前,请切换到 root 用户。

# 查看当前 swap
➜  ~ free -m
             total       used       free     shared    buffers     cached
Mem:           992        923         68          0         40        292
-/+ buffers/cache:        590        401
Swap:            0          0          0

注意这一行:

Swap:            0          0          0

添加 swap

Step 1: Create Storage File

➜  ~ sudo fallocate -l 2G /swapfile

Step 2: Secure swap file

➜  ~ sudo chmod 600 /swapfile

Step 3: Set up a Linux swap area

➜  ~ sudo mkswap /swapfile

Step 4: Enabling the swap file

➜  ~ sudo swapon /swapfile

Step 5: Update /etc/fstab file

➜  ~ sudo sh -c 'echo "/swapfile none swap sw 0 0" >> /etc/fstab'

Step6: 重启系统

➜  ~ reboot

How do I verify swap is activated or not?

Simply use the free command:

➜  ~ free -m
             total       used       free     shared    buffers     cached
Mem:           992        899         92          0        165        181
-/+ buffers/cache:        552        440
Swap:         2047          0       2047

How can I display swap usage summary on Linux?

Type the following swapon command:

➜  ~ sudo swapon -s
Filename       				Type   		Size   	Used   	Priority
/swapfile                      file      2097148     0        -1

How can I disable devices and files for paging and swapping on Linux?

You need to use the swapoff command:

➜  ~ sudo swapoff /var/swap

阿里云对 swap 的限制

经过上面的操作,free -m 确实可以看到 swap,但是 used 恒为 0。原因是阿里云做了如下修改:

  1. 不创建 swap 分区(移除了镜像中创建 swap 的指令)
  2. 禁用 swap 分区(将vm.swappiness设定为0)

查看当前系统内核参数 vm.swappiness

sudo sysctl -a | grep swappiness

vm.swappiness = 0

swappiness

  • 最小值 0,禁用 swap
  • 最大值 100,尽可能使用 swap
  • linux的基本默认设置为60,也就是说,在内存使用 100 - 60 = 40% 的时候,就开始使用交换分区。
  • 为了照顾性能,我们将数字调整为 20,即在内存使用到 80% 开始使用交换分区。

阿里云ECS的默认值为0,需要我们手动调整为 20。而树莓派的默认值为 1,也需要调整为 20。

修改

sudo vi /etc/sysctl.conf
  • vm.swappiness=20
  • vm.vfs_cache_pressure = 50

保存后,加载最新配置

sudo sysctl -p

确认下最新状态:

cat /proc/sys/vm/swappiness

关闭 swap

如果需要关闭 swap 可以在启动项里关闭 SWAP分区:在/etc/rc.d/rc.local 文件添加一行:

swapoff -a