一、主机环境
ubuntu 22.04 64位
2vcpu+2GB内存+40G系统盘
二、开启 Swap(虚拟内存)
Swap 相当于在硬盘上划出一块区域当“虚拟内存”用,当物理内存爆满时,系统会把不活跃的数据挪到硬盘上,防止系统直接崩溃。
1、查看内存使用情况,看available参数还剩多少
free -h
2、创建 Swap 文件
在根目录下创建一个名为 swapfile 的文件。对于 2GB 内存的服务器,建议设置 2GB 的 Swap 空间,1:1最好。
sudo fallocate -l 2G /swapfile
注意:如果提示 fallocate failed,可以改用 sudo dd if=/dev/zero of=/swapfile bs=1M count=2048,虽然慢一点但更稳妥。
3、设置权限
为了安全,Swap 文件只能被 root 用户读写。
sudo chmod 600 /swapfile
4、格式化为 Swap
将这个文件格式化为 Swap 空间。
sudo mkswap /swapfile
执行后你会看到类似 Setting up swapspace version 1… 的提示。
5、启用 Swap
立即启用这个文件,无需重启即可生效。
sudo swapon /swapfile
6、设置开机自动挂载
这一步非常关键,否则重启后 Swap 就失效了。我们需要把它写入 /etc/fstab 配置文件。
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
7、验证是否成功
执行完上述步骤后,输入以下命令查看内存状态:
free -h
看到类似下面的输出(重点看 Swap 那一行):
total used free shared buff/cache available
Mem: 1.9G 300M 1.2G 1.0M 400M 1.5G
Swap: 2.0G 0B 2.0G
只要 Swap 这一行显示的大小是 2.0G(或者你设置的大小),就说明成功了!
💡 补充建议
设置好 Swap 后,你的服务器在内存吃满时不会直接卡死,而是会变慢(因为硬盘读写比内存慢)。这给了宝贵的缓冲时间去处理问题,或者等待流量高峰过去。
三、优化 Swap 的使用策略
虽然 Swap 装好了,但如果不调整一下“使用倾向”,效果会打折扣。
Linux 默认比较“懒”,要等到物理内存快用光了(比如只剩一点点)才开始用 Swap。对于只有 2GB 的小内存服务器,我们需要让它积极一点,早点把不常用的数据挪到 Swap 里,留出物理内存给关键进程。
建议执行以下操作,优化 Swap 的使用策略
1、查看当前的使用倾向
输入以下命令查看数值(默认通常是 60)
cat /proc/sys/vm/swappiness
2、临时调整为积极模式
输入以下命令,将数值改为 10(数值越低越倾向于保留物理内存,但对于小内存服务器,10-20 是个平衡点;如果设为 1或者0,则表示尽量用光物理内存才用 Swap)
sudo sysctl vm.swappiness=10
3、设置开机永久生效
为了防止重启后失效,需要写入配置文件:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
四、开启 ZRAM
这是目前针对小内存服务器最有效的优化手段。
原理:ZRAM 会在物理内存中划出一块区域,把数据压缩后再存储。
为什么适合:
速度极快:它是用 CPU 换空间,读写速度是内存级的,比硬盘 Swap 快几千倍。
节省空间:数据被压缩了,原本只能存 1GB 数据的内存,开启 ZRAM 后可能能存 2-3GB。
保护硬盘:减少了物理 Swap 文件(硬盘)的读写次数,延长 SSD 寿命。
1、开启(Ubuntu 22.04)
1.1、安装zram-tools
sudo apt install zram-tools
安装后,编辑配置文件 /etc/default/zramswap,将 ALGO 设置为 zstd(压缩率高且快),PERCENT 设置为 50(使用 50% 的物理内存做压缩)。然后重启服务即可。
1.2、编辑配置文件
1.2.1、编辑
nano /etc/default/zramswap
1.2.2、选择压缩算法 (ALGO)
修改前: #ALGO=lz4
修改后: ALGO=zstd
理由: 虽然 lz4 速度最快,但 zstd 在压缩比和速度之间取得了更好的平衡。对于你的 2GB 小内存服务器,更高的压缩比意味着能“省”出更多内存空间,这点 CPU 开销是完全值得的。
1.2.3、设置占用内存比例 (PERCENT)
修改前: #PERCENT=50
修改后: PERCENT=50
理由: 这表示使用 50% 的物理内存来创建 ZRAM 设备。对于 2GB 内存的服务器,50 是一个非常合适的值,它会创建大约 1GB 的压缩块设备。
1.2.4、设置优先级 (PRIORITY)
修改前: #PRIORITY=100
修改后: PRIORITY=100
理由: 这个值必须比你之前创建的硬盘 Swap 文件(/swapfile)的优先级要高(硬盘 Swap 默认是 -1 或 -2)。设置为 100 可以确保系统会优先使用速度飞快的 ZRAM,只有当 ZRAM 也用满时,才会退而求其次使用硬盘 Swap。这完美实现了我们“ZRAM 为主,硬盘 Swap 兜底”的策略。
1.2.5、应用更改
修改并保存文件后(在 nano 编辑器中按 Ctrl+O 保存,Ctrl+X 退出),你需要重启 zramswap 服务来让配置生效。
在终端中执行:
sudo systemctl restart zramswap
1.2.6、验证效果
执行完重启命令后,你可以再次使用 free -h 命令来查看内存状态。
free -h
你会看到类似下面的输出,说明 ZRAM 已经成功启用,并且系统现在有了两种 Swap:
total used free shared buff/cache available
Mem: 1.6Gi 800Mi 200Mi 40Mi 600Mi 600Mi
Swap: 3.0Gi 0B 3.0Gi
注意看 Swap 的总量,它现在应该是硬盘 Swap 的大小(2GB)加上 ZRAM 设备的大小(约 1GB)的总和。
现在,你的服务器已经拥有了一个非常高效、分层的内存交换系统:
物理内存:优先使用。
ZRAM:当物理内存紧张时,优先使用这个内存中的“压缩包”,速度极快。
硬盘 Swap:当 ZRAM 也满了之后,作为最后的“安全气囊”兜底,防止系统崩溃。
2、 调整 I/O 优先级 (vm.swapiness)
虽然已经调整了使用 Swap 的“意愿”(swappiness),但还可以调整使用 Swap 时的“优先级”。
原理:当系统被迫使用 Swap 时,你可以告诉内核:“请把 Swap 的 I/O 优先级调低一点,不要抢占正常业务的磁盘读写”。
设置方法:
2.1、查看当前优先级(默认通常是 0)
cat /proc/sys/vm/page-cluster
2.2、修改,永久生效,写入配置文件
echo "vm.page-cluster=0" | sudo tee -a /etc/sysctl.conf
五、检查
这张截图的结果显示:ZRAM 目前并没有生效。
虽然 Swap 的总量变成了 2.8Gi(这说明 ZRAM 的 1GB 和硬盘 Swap 的 2GB 加在一起被系统识别到了),但是 free -h 这个命令有一个局限性:它把所有类型的 Swap(硬盘 + 内存压缩)加在一起显示了,看不出 ZRAM 是否在独立工作。
要确认 ZRAM 是否真的在运行,你需要用下面这个更精准的命令来查看
1、检查命令
cat /sys/block/zram0/mm_stat
结果分析
如果 ZRAM 成功运行
你会看到一串数字,类似这样:
12345678 9876543 …
(只要能看到数字输出,而不是报错,就说明 ZRAM 设备已经启动并在统计内存压缩情况了)
如果 ZRAM 没启动
你会看到报错:
cat: /sys/block/zram0/mm_stat: No such file or directory
2、手动启动服务:
sudo systemctl enable --now zramswap
执行完后,再次输入 free -h,你会发现 Swap 总量依然显示 2.8G,这时候再输入 cat /sys/block/zram0/mm_stat,应该就能看到数据了。
总结:只要 /sys/block/zram0/ 这个目录存在,你的 ZRAM 就是成功的!
六、检查优先级
1、检查
swapon --show
2、对比预期结果
NAME TYPE SIZE USED PRIO
/swapfile file 2G 300K -2
/dev/zram0 partition 804.4M 0B 100
数据解读
/dev/zram0:
SIZE: 804.4M。这就是我们设置的 50% 内存(1.6G的一半),大小刚刚好。
PRIO: 100。这是高分!系统会优先把数据往这里塞,因为这里是内存压缩,速度极快。
USED: 0B。目前还没怎么用,说明你现在的负载很轻,内存很充足。
/swapfile:
SIZE: 2G。这是你的硬盘保底空间。
PRIO: -2。这是低分。只有当上面那个 800M 的 ZRAM 彻底塞满了,系统才会被迫动用这个硬盘 Swap。