这几天我的一台小服务器卡的不要不要的,重启之后虽然不卡了,但过个几天,又卡成翔了。

研究了一下,发现 CPU 占用并不高,问题是内存不够用,看来是部署的服务太多了。

由于是阿里云搞活动买的 99 一年的 ECS ,只有 2G 的内存,部署了 redis、mysql、gitea,还跑了两个版本的 php-fpm,用 ps aux --sort=-%mem | head -n 11 命令查看了一下内存大户,mysql 毫无疑问排在了第一。

秉持着榨干服务器最后一滴价值的原则,果断给服务器加了 2G 的交换内存。

下面是操作步骤:

1. 查看当前 swap 状态

swapon --show
free -h

2. 创建一个新的 swap 文件(例如 2G 大小)

sudo fallocate -l 2G /swapfile
PS: 如果 fallocate 不可用,可用 sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

3. 设置正确的权限

sudo chmod 600 /swapfile

4. 格式化成 swap 文件

sudo mkswap /swapfile

5. 启用 swap 文件

sudo swapon /swapfile

6. 确认是否启用成功

swapon --show
free -h

7. 设置开机自动挂载

编辑 /etc/fstab 文件,在文件末尾添加:

/swapfile none swap sw 0 0

交换内存的策略设置

需要注意的是,默认情况下交换内存的策略 swappiness 为 0,也就是尽可能不使用 swap,只有在内存实在不够的时候才会使用。

vm.swappiness 是一个取值为 0~100 的参数,它决定了 Linux 内核多早开始把内存中的数据移到 swap 区(虚拟内存)。

  • swappiness = 0:几乎完全不使用 swap,除非内存真的用光了。
  • swappiness = 100:非常积极使用 swap,即使还有很多内存可用,也会频繁把数据放进 swap。

一般来说,服务器会设置为 10~30,也就是优先使用内存,但在压力大的时候适当使用交换内存,提供缓冲。

如果 swappiness 为 0,在压力突然增大的时候还是有可能会造成应用崩溃的。

查看 swappiness

cat /proc/sys/vm/swappiness

将 swappiness 设置为 10

sudo sysctl vm.swappiness=10

让它永久生效

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

标签: 内存, 交换空间, 交换内存, swapfile

添加新评论