先把当时的情况摆出来。内存不够想加八 G 的 swap,用 dd 建好文件后执行 swapon,直接报 Invalid argument,free 里交换分区总量一直是零,内存压力一点没缓解。
把日志和配置对完,能解释这个现象的基本就这几处。根分区是 btrfs,本身就不支持把普通文件当 swap 用。也可能是文件存在空洞,mkswap 写进去的结构不连续。
不容易想到的是,SELinux 上下文不对,内核拒绝启用这个文件。
先确认根分区的文件系统类型
findmnt -no FSTYPE /
然后用 dd 生成没有空洞的文件
dd if=/dev/zero of=/swapfile bs=1M count=8192
接着设置权限并格式化
chmod 600 /swapfile && mkswap /swapfile
剩下的就是启用并确认总量
swapon /swapfile && free -h
那几天正好在做别的变更,先把时间线对齐才敢动手。
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
恢复的判定其实很直接。free -h 里交换总量增加八 G,swapon –show 能列出这个文件,内存压力测试时确实有换出。
swapfile 的权限必须是六百,而且所在分区不能是 btrfs;加 swap 只是缓解,不是解决内存不足的根本办法。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。