云服务器内存告急?5分钟教你用swapfile给Linux系统加个“虚拟内存”应急
云服务器内存告急?5分钟教你用swapfile给Linux系统加个“虚拟内存”应急
凌晨三点,服务器监控突然狂闪——内存占用飙升至95%,MySQL进程被OOM Killer强制终止。作为运维工程师,这种场景你一定不陌生。低配云服务器(比如1核1G的ECS)跑数据库或Web服务时,内存就像早高峰的地铁车厢,稍不注意就会爆满。但临时升级配置需要走审批流程,业务又不能停,这时候 swapfile 就是你的急救包。
与传统的交换分区不同,swapfile就像临时在磁盘上划出一块"虚拟内存"区域。它不需要重新分区,不用重启服务器,甚至不需要root以外的任何权限。下面这个真实案例来自我们团队:某电商大促期间,2核4G的Redis服务器突发流量,通过紧急创建2GB swapfile避免了缓存雪崩,为扩容争取了4小时黄金时间。
1. 快速诊断内存现状
在动手之前,我们需要明确三个关键问题:
- 当前内存剩余多少?
- 是否已存在交换空间?
- 如果是突发流量,预计需要多少额外内存?
第一步
,用
free -h
查看内存概况。注意
available
列而非
free
列,前者包含了可回收的缓存内存:
$ free -h
total used free shared buff/cache available
Mem: 3.7Gi 2.1Gi 230Mi 16Mi 1.4Gi 1.3Gi
Swap: 0B 0B 0B
第二步
,用
swapon --show
确认现有交换空间类型。如果输出为空(如上例),说明完全没有交换空间;若显示
TYPE=partition
则是传统交换分区,
TYPE=file
才是交换文件:
$ swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2
小技巧:如果服务器正在频繁OOM,先用
dmesg | grep oom定位被杀的进程,评估是否值得用swapfile争取时间。
2. 紧急创建swapfile实战
假设诊断结果显示需要2GB临时交换空间,以下是SSD云盘上的最优操作流程:
2.1 快速分配交换文件
传统教程推荐用
dd
命令,但在云环境我更推荐
fallocate
——它直接操作文件系统元数据,速度比写零快100倍:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile # 必须限制权限
避坑指南:某些旧文件系统(如ext3)不支持fallocate,此时可用
dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
2.2 启用交换文件
通过mkswap初始化后,用swapon立即生效:
sudo mkswap /swapfile # 输出包含UUID可忽略
sudo swapon /swapfile
验证是否生效:
$ swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2
$ free -h
total used free shared buff/cache available
Mem: 3.7Gi 2.1Gi 230Mi 16Mi 1.4Gi 1.3Gi
Swap: 2.0Gi 0B 2.0Gi
2.3 配置自动挂载(可选)
如果判断需要长期使用,编辑
/etc/fstab
追加(注意不要换行):
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
3. 性能调优与监控
swapfile不是银弹,不当使用反而会拖垮性能。通过这三个维度确保最佳实践:
3.1 调整swappiness
该值(0-100)决定系统使用swap的积极程度。对数据库等延迟敏感服务,建议设为10-30:
# 临时生效
sudo sysctl vm.swappiness=30
# 永久配置
echo 'vm.swappiness=30' | sudo tee -a /etc/sysctl.conf
3.2 实时监控工具
-
基础监控
:
vmstat 1看si(swap in)和so(swap out) -
详细分析
:
sar -W 1监控页面交换频率 -
历史趋势
:
cat /proc/vmstat | grep pswp
3.3 SSD特别注意事项
- 将swapfile放在独立挂载点,避免与业务IO竞争
-
通过
ionice降低swap优先级:echo 'ACTION=="add", KERNEL=="swap", SUBSYSTEM=="block", ATTR{queue/io_priority}="7"' | sudo tee /etc/udev/rules.d/60-swap-priority.rules
4. 后续优化决策树
swapfile只是应急方案,后续应该根据业务场景选择长期对策:
是否需要持续使用swapfile?
├─ 否 → 业务稳定后执行:
│ ├─ sudo swapoff /swapfile
│ └─ sudo rm /swapfile
└─ 是 → 考虑以下优化:
├─ 调整swappiness到更低值
├─ 将swapfile迁移到高速磁盘
└─ 用多个小swapfile分散IO压力
最终决策建议:如果swap使用率持续超过30%,就应该优先考虑垂直扩容或应用层优化(比如Redis的maxmemory-policy)。去年我们一个客户用swapfile临时支撑了3天,最终通过优化MySQL的innodb_buffer_pool_size节省了40%内存占用。
更多推荐

所有评论(0)