温馨提示×

如何解决CentOS swapper相关问题

小樊
39
2025-11-16 01:10:59
栏目: 智能运维

CentOS 中与 swapper 相关的常见问题可分为三类:Swap 占用异常或性能下降、Swap 未启用或无法挂载、以及内核日志出现 “scheduling while atomic: swapper” 等严重错误。下面给出可操作的排查与修复步骤。


一、快速定位与通用排查

  • 查看内存与 Swap 使用
    • 执行:free -hswapon --showcat /proc/swaps,确认 Swap 总量、已用与设备/文件是否生效。
  • 找出占用 Swap 最多的进程
    • 执行:for i in $(ls /proc | grep "^[0-9]"); do awk '/Swap:/{a+=$2} END{print $i, a/1024 "M"}' /proc/$i/smaps 2>/dev/null; done | sort -k2nr | head,定位异常进程并决定优化或终止。
  • 调整内核交换倾向
    • 临时:sudo sysctl vm.swappiness=10(范围 0–100,值越低越倾向少用 Swap,常用 10–30)。
    • 永久:在 /etc/sysctl.conf 添加 vm.swappiness=10,执行 sudo sysctl -p 生效。
  • 检查配置文件与自动挂载
    • 核对 /etc/fstab 中 Swap 行是否正确(示例:/swapfile swap swap defaults 0 0/dev/sdXY none swap sw 0 0),随后执行 sudo swapon -a 测试。
  • 查看系统日志
    • 执行:journalctl -xedmesg | grep -i swapjournalctl -b -1 | grep -i swap,捕捉设备不可用、挂载失败、内存分配失败等线索。
  • 资源与 I/O 监控
    • 执行:top/htopvmstat 1iostat -x 1,判断是否因物理内存不足或磁盘 I/O 瓶颈导致性能问题。

二、典型场景与解决方案

  • Swap 占用过高导致系统变慢

    • 现象:free -h 显示 Swap 使用率接近 100%iostat 观察到 swap 读写高。
    • 处理:
      • 用上文命令定位高占用进程,优化应用内存或临时终止异常进程。
      • 降低 vm.swappiness(如设为 10)以减少换出。
      • 若内存确实不足,优先考虑增加物理内存或扩容 Swap(见下一节)。
  • Swap 未启用或重启后不自动挂载

    • 现象:free -h 显示 Swap 为 0;手动 swapon 报错或 swapon -a 失败。
    • 处理:
      • 核对 /etc/fstab 路径/选项是否正确;设备名变更(如 /dev/sdb1 → /dev/sdc1)需同步更新。
      • 执行 sudo swapon -a 启用所有 fstab 中的 Swap;必要时用 blkid 获取 UUID,在 fstab 中使用 UUID=... 提升稳定性。
      • 若是文件型 Swap,确认已 mkswap 且权限为 600
  • 调整或重建 Swap 的大小与介质

    • 扩大 Swap(文件方式,示例新增 8G):
      • sudo fallocate -l 8G /swapfile(或 dd if=/dev/zero of=/swapfile bs=1M count=8192
      • sudo chmod 600 /swapfile
      • sudo mkswap /swapfile
      • sudo swapon /swapfile
      • /etc/fstab 添加:/swapfile swap swap defaults 0 0
    • 缩小/删除 Swap:
      • sudo swapoff /swapfile
      • 调整文件大小(如 truncate -s 4G /swapfile 或重建),再 mkswapswapon
      • /etc/fstab 移除对应行并 rm -f /swapfile
    • 使用 LVM 或分区:可用 swapon /dev/mapper/VolGroup-lv_swapswapon /dev/sdXY;在 fstab 中优先使用 UUIDLABEL 提高可移植性。
    • 使用 zram(内存内压缩交换,减少磁盘 I/O):
      • sudo modprobe zram
      • echo lz4 > /sys/block/zram0/comp_algorithm
      • echo 4G > /sys/block/zram0/disksize
      • mkswap /dev/zram0 && swapon /dev/zram0
      • 如需开机启用,配置 udev/服务或 systemd unit。
  • SSD 上 Swap 磨损或性能不佳

    • 建议:内存充足(如 ≥16G)且为内存敏感场景时,可禁用磁盘 Swap 并优先用 zram;若必须使用磁盘 Swap,尽量放在高速分区,合理设置 vm.swappiness,并持续监控写入量与健康状态。

三、系统无法正常启动或内核报错的处理

  • 进入单用户/救援模式修复
    • CentOS 7:GRUB 中选中内核按 e,将 ro 改为 rw,行尾添加 init=/bin/bash,删除 rhgb quiet,按 Ctrl+X 启动;进入后可修正 /etc/fstabswapoff/swaponsysctl 等。
    • CentOS 6:GRUB 内核行末尾添加 single 启动到单用户模式。
  • 分析内核日志
    • 执行:dmesg | grep -i "scheduling while atomic",若日志指向特定驱动/模块,优先升级或回退该驱动;若为自研模块,避免在原子上下文调用会睡眠的函数。
  • 文件系统与磁盘检查
    • 在救援/单用户下对疑似分区执行 fsck;用 smartctl -a /dev/sda 检查磁盘健康;必要时对内存做 memtest86+ 检测。

四、预防性配置与最佳实践

  • /etc/fstab 中使用 UUID/LABEL 指定 Swap,避免设备名漂移;必要时设置 pri= 调整多 Swap 优先级。
  • 合理设置 vm.swappiness:桌面/交互式负载建议 10–30;内存密集型服务依据延迟与稳定性权衡(数据库等可适度提高)。
  • 监控与告警:持续关注 freevmstatiostatjournalctl 中与 Swap 相关的异常;对 SSD 场景监控写入寿命与健康度。
  • 变更前备份重要数据与配置文件,先在测试环境验证;生产环境调整 Swap 大小或禁用策略时安排维护窗口。

0