4.7.4 交换分区与Swappiness调优
交换分区与Swappiness调优#
交换分区(Swap)在内存不足时将部分内存页写入磁盘,以避免进程被立刻杀死,但会引入明显的 I/O 延迟。合理配置 Swap 与 Swappiness 能在“内存突增”与“性能稳定”之间取得平衡。
1. 原理草图:内存与Swap的换页路径#
2. 交换分区类型与创建(示例与命令解释)#
- Swap分区:独立分区,性能较稳定,适合固定环境。
- Swap文件:易扩容,运维灵活,现代内核支持良好。
示例:创建 8G Swap 文件并持久化
# 1) 创建Swap文件(优先使用fallocate,速度快)
fallocate -l 8G /swapfile
# 2) 设置权限(必须是600,否则启用会被拒绝)
chmod 600 /swapfile
# 3) 格式化为swap区域
mkswap /swapfile
# 4) 启用swap
swapon /swapfile
# 5) 查看结果
swapon --show
free -h
持久化(重启生效)
# /etc/fstab 追加一行
/swapfile swap swap defaults 0 0
预期效果
- swapon --show 出现 /swapfile
- free -h 中 Swap Total 为 8G
3. 交换使用监控与判断(含命令解释)#
# 查看总Swap与已用
free -m
# 输出中 Swap: total used free
# 观察换入换出速率(si/so)
vmstat 1
# si: swap in, so: swap out(单位KB/s)
# 监控趋势
sar -W 1
# pswpin/s, pswpout/s: swap换入/换出速率
判断原则
- si/so 长期高:内存压力大,需扩容或优化。
- 偶发小量换出:可接受,但需关注延迟敏感业务。
4. Swappiness 调优(含示例)#
Swappiness 取值范围 0~100,表示内核倾向使用 Swap 的程度:
- 数值低:尽量保留内存页,减少换出。
- 数值高:更积极使用 Swap,释放内存页缓存。
# 查看当前值
cat /proc/sys/vm/swappiness
# 临时设置为10(重启失效)
sysctl vm.swappiness=10
# 持久化
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
推荐范围
- 数据库/缓存:10~20
- 通用业务:20~40
- 内存小或波动明显:40~60
5. 性能权衡与典型策略#
- Swap 过小:易触发 OOM,系统不稳定。
- Swap 过大:可能掩盖内存不足,导致抖动。
- 常见范围:物理内存的 0.5~1 倍(现代生产可适当降低)。
6. 排错与恢复步骤(示例)#
问题1:swapon 报错 “Permission denied”
# 原因:权限非600
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
问题2:swap 文件被占用或损坏
# 先关闭再重新格式化
swapoff /swapfile
mkswap /swapfile
swapon /swapfile
问题3:系统频繁换页导致卡顿
# 降低swappiness(临时)
sysctl vm.swappiness=10
# 观察换页是否下降
vmstat 1
7. 练习#
- 创建一个 2G 的 Swap 文件并持久化,验证重启后生效。
- 将 Swappiness 设为 10,观察
vmstat中 si/so 是否下降。 - 人为制造内存压力(如
stress或dd),记录 Swap 使用变化并写出判断结论。
练习提示(可选安装工具)
# Debian/Ubuntu
apt -y install stress
# RHEL/CentOS
yum -y install epel-release && yum -y install stress