swapoff -a 不能清空 swap 数据,而是将已换出的页面换回内存并禁用所有 swap 设备;若空闲内存不足则失败,且不删除或擦除磁盘上的 swap 文件内容。

swapoff -a 能不能直接清空 Swap 数据
能,但不是“清空”而是“换回内存”。swapoff -a 的本质是把所有仍在 Swap 中的页面(pages)尝试换入物理内存,并禁用所有 Swap 设备。只要当前空闲内存 ≥ 已使用的 Swap 量,它就能成功完成;否则会报 Device or resource busy。
常见错误现象:
-
swapoff -a卡住或报错,free -h显示 Swap used 非零但无法释放 - 执行后
swapon --summary仍有输出,说明部分 Swap 设备未被禁用
关键点:
- 该操作不删除 Swap 文件或分区,只停用并回收内容
- 它不保证“立即腾出磁盘空间”,Swap 文件本身仍存在、大小不变
- 如果系统内存吃紧,
swapoff -a可能失败甚至触发 OOM killer
遇到 “Device or resource busy” 怎么办
内核锁定部分 Swap 页面(比如某些内核线程、锁页内存、tmpfs 映射),导致无法换回。这时不能硬删文件,得先缓解内存压力。
实操建议:
- 先运行
sudo sysctl -w vm.drop_caches=3:清空 pagecache、dentries 和 inodes,释放缓存压力(安全,不影响运行中进程) - 等待 1–2 秒,再重试
sudo swapoff -a - 若仍失败,检查是否有服务显式锁定内存(如 PostgreSQL 的
shared_buffers、某些实时音视频进程),临时停止它们再试
注意:vm.drop_caches=3 不影响已分配的匿名页,只清理缓存类内存,所以它不会导致数据丢失,但可能短暂增加后续磁盘读取延迟。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
想彻底擦除 Swap 文件内容(防残留敏感数据)
仅停用 Swap 不等于清除磁盘上的旧数据。Swap 文件(如 /swapfile)里可能残留密码、密钥、日志片段等。要真正“擦除”,需在 swapoff 后覆盖写入。
推荐做法:
- 先执行
sudo swapoff /swapfile(指定路径更稳妥,避免误关其他设备) - 用
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024覆盖(按实际文件大小调整count,可用ls -lh /swapfile查看) - 或更安全地用
sudo shred -n 1 -z /swapfile(需安装coreutils,-n 1覆盖一次,-z结尾填零防恢复) - 最后
sudo mkswap /swapfile重建,再sudo swapon /swapfile启用
警告:不要对 LVM LV 或加密卷直接 dd,可能破坏元数据;优先查清设备类型再操作。
为什么 swapon -a 之后 Swap used 又涨上去了
这是正常行为,不代表没清干净。Linux 内核在 swapon -a 后会重新开始使用 Swap —— 尤其当 vm.swappiness > 0(默认通常是 60)。它不是“恢复旧数据”,而是新产生的换出行为。
如果你的目标是“压测时不走 Swap”,请同步做:
- 临时设
sudo sysctl vm.swappiness=0(禁止主动换出) - 确认
free -h中 available 内存充足(不只是 free) - 避免启动大量内存型服务(如 Chromium、Java 应用)干扰测试
真正容易被忽略的是:Swap 使用量回升 ≠ 清理失败,而是内核策略与负载共同作用的结果。判断是否“清干净”,只看 swapoff -a 执行后 free -h 的 Swap 行是否全为 0B,而不是之后会不会再涨。










