应每日凌晨低谷期(如3:15)定时刷新Swap,先检查MemAvailable≥2GB再执行swapoff-a&&swapon-a,并避开备份等任务时段,通过日志和/proc/vmstat验证效果。

Swap 空间长期不刷新,容易积压旧页(尤其是被换出但未被回收的“脏数据”),导致后续内存压力升高时换入效率下降、IO抖动加剧。配合 crontab 在系统低谷期(如凌晨负载最低时段)自动刷新 Swap,是一种轻量、可控的维护手段——关键不是“频繁清理”,而是选对时机、留足缓冲、避免干扰业务。
确认当前 Swap 使用状态和低谷时段
先观察系统真实负载规律,再决定刷新时间:
- 用 free -h 和 swapon --show 查看当前 Swap 使用率与设备路径
- 用 vmstat 1 60 或 top -b -n2 -d1 | grep "load average" 观察凌晨 2–4 点的平均负载(load average)、si/so(swap in/out)是否持续低于 0.3 且无明显波动
- 检查是否有定时备份、日志轮转等任务在相同时段运行,避开它们(比如避开
/etc/cron.daily/logrotate默认的 06:25)
编写安全刷新脚本(带保护逻辑)
直接 swapoff -a && swapon -a 风险较高:若物理内存不足,swapoff 可能失败或触发 OOM。建议脚本加入内存余量判断:
- 创建脚本:
sudo nano /usr/local/bin/refresh-swap.sh - 内容如下(含注释说明):
#!/bin/bash
# 检查剩余可用内存是否 ≥ 2GB(可根据实际调整)
avail_mem_kb=$(awk '/^MemAvailable:/ {print $2}' /proc/meminfo 2>/dev/null)
if [[ "$avail_mem_kb" =~ ^[0-9]+$ ]] && [ "$avail_mem_kb" -lt 2097152 ]; then
echo "$(date): Skipped — MemAvailable too low ($avail_mem_kb KB)" >> /var/log/swap-refresh.log
exit 1
fi
<h1>关闭并重启用所有 swap 设备(非强制 force)</h1><p>if swapoff -a 2>/dev/null; then
swapon -a 2>/dev/null
echo "$(date): Swap refreshed successfully" >> /var/log/swap-refresh.log
else
echo "$(date): swapoff failed — likely memory pressure or locked pages" >> /var/log/swap-refresh.log
fi
- 赋予执行权限:
sudo chmod +x /usr/local/bin/refresh-swap.sh
配置 crontab 定时任务(推荐每日一次低峰执行)
以 root 身份编辑系统级定时任务(避免用户权限不足):
- 运行:
sudo crontab -e - 添加一行(示例:每天凌晨 3:15 执行,避开常见任务高峰):
15 3 * * * /usr/local/bin/refresh-swap.sh
- 该时间表达式含义:第 15 分钟、3 点、每天、每月、每周任意天
- 日志已写入
/var/log/swap-refresh.log,可随时检查执行结果
补充建议:监控与验证效果
刷新后需确认是否真正释放了脏页、是否影响应用稳定性:
- 刷新前后对比:
cat /proc/swaps(查看 priority 和 size 是否重置)、grep -i "pgpgin\|pgpgout\|pswpin\|pswpout" /proc/vmstat(观察换入换出计数是否归零趋势) - 长期观察:
sudo atop -r回放历史,筛选 swap 相关指标(SWP、SWPOUT、SWPIN)是否在刷新后明显回落 - 若发现某次刷新后服务响应变慢,说明该时段并非真正低谷,应推迟时间或增加内存余量阈值

















