当swap文件因物理坏道导致io死锁时,须分层处理:先确认d状态进程与设备100%util,再降swappiness、清缓存、终止非关键进程释放内存;若swapoff阻塞,则用dd覆写swap header使其失效,再swapoff -a卸载;最后注释fstab、验证卸载并扫描坏道。

当 swap 文件因底层物理坏道导致读写死锁(如 swapoff 卡住、swapon 失败、free -h 显示 swap 仍启用但 I/O 持续超时),说明内核已陷入页换入/换出路径的不可中断等待(D 状态)。此时不能简单重试或强制 kill,必须按内存状态分层处理,优先保系统可用性。
确认死锁是否真实存在
先排除误判:运行 sudo cat /proc/swaps 查看 swap 设备是否仍 listed;再执行 sudo iostat -x 1 观察对应设备(如 sdb)的 %util 是否持续 100%、await 是否飙升至数秒以上;最后用 ps aux | awk '$8 ~ /D/ {print $0}' 检查是否存在处于不可中断睡眠态的进程(尤其是 kswapd 或 khugepaged)。若三者同时成立,基本可判定为坏道引发的 swap I/O 死锁。
避免触发 OOM 的安全隔离步骤
直接 swapoff 可能失败或加剧卡顿。应先释放 swap 压力,再断开关联:
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 临时降低 swappiness,减少新页面换出:
sudo sysctl vm.swappiness=1 - 手动触发内存回收,促使内核将可回收页(如 page cache)释放,缓解对 swap 的依赖:
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' - 检查并终止明显占用大量匿名内存且非关键的用户进程(如大内存 Python 脚本、Java 应用),腾出 RAM 空间:
ps aux --sort=-%mem | head -n 10 - 确认剩余空闲内存 ≥ 当前 swap 使用量(
free -h中available值 >SwapUsed),才进入下一步
绕过内核 I/O 层强制卸载
若常规 swapoff /swapfile 阻塞,说明 VFS 层仍在等待磁盘响应。此时需跳过文件系统路径,直接操作 swap header:
- 获取 swap 文件的底层块设备与偏移:
sudo filefrag -v /swapfile | grep "extents",结合lsblk定位物理设备(如/dev/sdb) - 使用
dd向 swap header 区域写零(仅覆盖前 10 个扇区),使其失去有效性:sudo dd if=/dev/zero of=/dev/sdb bs=512 seek=0 count=10 conv=notrunc(注意:seek=0是假设 swap 在设备起始;若为分区,改用/dev/sdb1并确认起始扇区) - 此时内核会检测到 swap 签名损坏,在下次内存压力触发换页时自动跳过该区域;随后执行
sudo swapoff -a通常可成功返回(因设备已“失效”,不再等待 I/O)
后续加固与验证
隔离后必须防止系统重启时自动挂载损坏 swap:
- 注释或删除
/etc/fstab中对应 swap 行(如/swapfile none swap sw 0 0前加#) - 运行
sudo swapon --show确认输出为空;cat /proc/swaps应无内容 - 对故障磁盘执行坏道扫描:
sudo smartctl -a /dev/sdb查看Reallocated_Sector_Ct和Current_Pending_Sector;若数值非零,立即下线该盘 - 如需保留 swap 功能,建议新建 swap 文件于健康磁盘,并启用
swapon --discard(支持 TRIM 的 SSD)或配置加密 swap(cryptsetup+ LUKS)提升安全性










