Ubuntu Swapper 交换分区问题诊断流程
一 快速体检
- 查看内存与交换概况:运行命令:free -h,关注 Swap 行的 total/used/free,判断是否已启用及使用量是否异常。
- 查看已启用的交换:运行命令:swapon --show 或 cat /proc/swaps,确认交换设备或文件是否存在、大小与优先级。
- 实时观察资源与换页:运行命令:top/htop(查看 Swap 行)、vmstat -s | grep swap(交换总量与使用量)、vmstat 1(观察 si/so 是否持续不为 0,表示换入/换出活跃)。
- 检查内核与系统日志:运行命令:dmesg | grep -i swap(内核层面的交换相关提示)、journalctl -b | grep -i swap(本次启动的交换相关日志)。
以上命令能快速判断“是否有交换、是否被使用、是否有报错”,是后续定位的基础。
二 常见症状与定位
- 症状一:交换未启用或“总量为 0”
- 执行:swapon --show 或 cat /proc/swaps,若为空,说明未启用。
- 检查设备/文件是否存在:分区用 sudo blkid,交换文件确认路径与权限。
- 启用:分区用 sudo swapon /dev/sdXN;文件用 sudo swapon /swapfile。
- 持久化:编辑 /etc/fstab,使用正确的 UUID(推荐)或路径,例如:
- 分区:UUID=xxxx none swap sw 0 0
- 文件:/swapfile none swap sw 0 0
- 验证:free -h 与 swapon --show 应显示正常。
- 症状二:开机卡在 “A start job is running for /dev/disk/by-uuid/xxxxx”(约 1分30秒)
- 比对 /etc/fstab 中的 swap UUID 与 sudo blkid 输出是否一致。
- 不一致则修正 /etc/fstab 中的 UUID;如暂时无法修复,可先注释该行以恢复正常启动,再后续处理。
- 症状三:系统卡顿但 Swap 使用为 0
- 检查 vm.swappiness:cat /proc/sys/vm/swappiness(默认常见为 60)。
- 临时调整:sudo sysctl vm.swappiness=10(倾向少用 swap,仅在内存紧张时再用)。
- 永久生效:在 /etc/sysctl.conf 中添加或修改 vm.swappiness=10 并重启或
sysctl -p。
- 症状四:怀疑交换文件损坏或大小不当
- 关闭全部交换:sudo swapoff -a。
- 备份后删除旧文件,重建(示例 2G):
- 创建:sudo fallocate -l 2G /swapfile(若失败可用 dd if=/dev/zero of=/swapfile bs=1M count=2048)
- 设权限:sudo chmod 600 /swapfile
- 格式化:sudo mkswap /swapfile
- 启用:sudo swapon /swapfile
- 写入 /etc/fstab:/swapfile none swap sw 0 0
- 验证:free -h、swapon --show。
以上步骤覆盖了“未启用、启动挂载失败、策略不当、文件损坏/大小不当”等高频场景。
三 深入分析与性能影响
- 观察换页是否频繁:vmstat 1 持续出现 si/so > 0 表示内存紧张导致频繁换页,应结合业务与内存容量评估是否增加物理内存或调整 swappiness。
- 查看 I/O 压力:iostat -x 1 观察 await、svctm、util,若交换所在磁盘 util 长时间接近 100%,说明交换设备成为瓶颈,优先考虑更快的存储(如 SSD)或优化内存占用。
- 关联进程与内存压力:top/htop 按内存占用排序,定位占用内存最多的进程,配合日志与业务排查异常行为。
这些手段有助于判断“交换是否引发性能问题”以及“瓶颈在何处”。
四 实用命令清单
- 状态与启用:
- free -h;swapon --show;cat /proc/swaps;sudo swapon /dev/sdXN 或 sudo swapon /swapfile;sudo swapoff -a
- 配置与持久化:
- sudo blkid;编辑 /etc/fstab(示例:UUID=… none swap sw 0 0 或 /swapfile none swap sw 0 0)
- 策略与内核:
- cat /proc/sys/vm/swappiness;sudo sysctl vm.swappiness=10;在 /etc/sysctl.conf 中设置 vm.swappiness
- 日志与诊断:
- dmesg | grep -i swap;journalctl -b | grep -i swap;vmstat -s | grep swap;vmstat 1;iostat -x 1;top/htop
以上命令覆盖了诊断、启用/禁用、持久化配置、策略调优与性能分析的关键路径。