温馨提示×

Swap空间满了怎么清理

小樊
34
2025-12-29 21:08:46
栏目: 云计算

Linux 中清理 Swap 的安全步骤

一、先判断是否可以安全释放

  • 查看内存与 Swap 使用:运行命令:free -hswapon -s,确认 Swap 已用满且物理内存是否有足够空闲(如可用内存明显大于 Swap 已用量,才适合执行回收)。
  • 原则:只有当物理内存足以容纳当前被换出的页面时,回收才安全;否则可能引发 OOM(内存溢出) 或严重卡顿。

二、快速释放 Swap 的推荐做法

  • 优雅回收(无需重启):依次执行
    1. sudo swapoff -a(将 Swap 数据迁回内存,过程可能较慢,请耐心等待)
    2. sudo swapon -a(重新启用 Swap)
  • 等待期间可用 free -mswapon -s 观察 Swap 使用是否降到接近 0
  • 重要前提:确保系统空闲内存足以容纳被换出的数据,否则不建议执行此操作。

三、无法一次性回收时的定位与处理

  • 找出占用 Swap 的进程:
    • 按进程汇总:
      for pid in $(ls /proc | grep '^[0-9]'); do
        if [ -f /proc/$pid/status ]; then
          swap=$(grep VmSwap /proc/$pid/status 2>/dev/null | awk '{print $2}')
          if [ -n "$swap" ] && [ "$swap" -gt 0 ]; then
            cmd=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\0' ' ')
            echo "PID: $pid, Swap: ${swap} kB, CMD: $cmd"
          fi
        fi
      done | sort -k5 -nr
      
    • 按进程详细页汇总:
      for i in $(cd /proc; ls | grep -E '^[0-9]+'); do
        awk '/Swap:/{a+=$2} END{printf "%s %.2fM\n", '"$i"', a/1024}' /proc/$i/smaps 2>/dev/null
      done | sort -k2 -nr | head
      
  • 处理建议:优先尝试重启占用 Swap 较多的进程以释放其内存;如业务允许,再考虑终止异常进程。一般“释放 Swap”的本质是让相关进程释放内存或重启。

四、释放页缓存以间接帮助回收 Swap(可选)

  • 执行:sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
  • 作用:清理页缓存、目录项和 inode,释放更多物理内存,从而让系统更容易把页面从 Swap 换回。注意这并非直接“清理 Swap”,而是为回收创造条件。

五、中长期优化与扩容

  • 降低系统对 Swap 的依赖:临时设置 vm.swappiness=10(默认通常为 60),减少换出倾向:
    • 临时:sudo sysctl vm.swappiness=10
    • 永久:在 /etc/sysctl.conf 中添加 vm.swappiness=10 并执行 sudo sysctl -p
  • 扩容或调整 Swap:
    • 新增 Swap 文件:
      sudo fallocate -l 2G /swapfile
      sudo chmod 600 /swapfile
      sudo mkswap /swapfile
      sudo swapon /swapfile
      echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
      
    • 如需减少/移除 Swap,先禁用(swapoff),再删除对应文件或在 /etc/fstab 注释条目,必要时用 mkswap/swapon 重建或重新启用。

0