CentOS Swapper常见问题及解决方案
问题表现:系统响应变慢、磁盘I/O繁忙(通过iostat
可观察到swap读写
速率高),free -h
命令显示Swap使用率接近100%。
原因分析:物理内存不足,系统被迫将大量内存数据交换到Swap分区;或swappiness
值设置过高(如默认60),导致系统过度依赖Swap。
解决方案:
free -h
确认Swap总大小及已用空间;通过top
或htop
按Shift+M
排序进程内存占用,再用for i in $(cd /proc; ls | grep "^[0-9]" | awk '$0 > 100'); do awk '/Swap:/{a=a+$2} END {print $0, a/1024"M"}' /proc/$i/smaps 2>/dev/null; done | sort -k2nr | head
找出占用Swap最多的进程。sudo sysctl vm.swappiness=10
(值范围0-100,建议10-60);永久生效则编辑/etc/sysctl.conf
,添加vm.swappiness=10
,然后运行sudo sysctl -p
使配置生效。sudo swapoff /swapfile
(或/dev/sdXY
)删除Swap,再通过rm -rf /swapfile
移除文件;若为分区,需用fdisk
删除对应分区并重新划分磁盘空间。问题表现:系统重启后Swap未自动激活,free -h
显示Swap使用量为0;或手动启用Swap时报错(如“device is busy”)。
原因分析:/etc/fstab
文件中Swap配置错误(如设备名变更、挂载选项有误);或Swap分区未格式化。
解决方案:
cat /etc/fstab
查看Swap配置行,确保格式为/dev/sdXY swap swap defaults 0 0
(若为Swap文件,则为/swapfile swap swap defaults 0 0
);若设备名变更(如/dev/sdb1
改为/dev/sdc1
),需更新为正确名称。sudo swapon -a
启用所有fstab
中配置的Swap;重启系统后再次运行free -h
,确认Swap已自动挂载。问题表现:系统日志(dmesg
或/var/log/messages
)中出现“scheduling while atomic: swapper”错误,系统可能崩溃或无法正常启动。
原因分析:内核代码在原子上下文(如中断处理程序、持有自旋锁、抢占禁用时)调用了可能触发调度的函数(如mutex_lock
、sleep
、schedule
)。
解决方案:
dmesg | grep -i "scheduling while atomic"
查看错误发生的具体内核函数(如irq_handler
、softirq
),定位触发错误的驱动或模块。mutex_lock
替换为mutex_lock_interruptible
,或使用自旋锁spin_lock
替代互斥锁);若为第三方驱动问题,升级驱动至最新版本或联系厂商修复。问题表现:物理内存较小(如4G以下)但Swap设置过小(如1G),导致频繁内存溢出;或物理内存较大(如64G以上)但Swap设置过大(如32G),浪费磁盘空间。
原因分析:未根据系统内存和使用场景调整Swap大小,遵循传统“内存2倍”规则导致配置过时。
解决方案:
fallocate -l 8G /swapfile
(或dd if=/dev/zero of=/swapfile bs=1M count=8192
)创建文件,执行chmod 600 /swapfile
设置权限,mkswap /swapfile
格式化,swapon /swapfile
启用;修改/etc/fstab
添加/swapfile swap swap defaults 0 0
实现开机自启。若需缩小Swap,先swapoff /swapfile
,再用truncate -s 0 /swapfile
清空文件,最后调整大小并重新格式化。问题表现:使用SSD作为Swap分区时,系统性能提升不明显,甚至因SSD频繁读写导致寿命缩短(表现为/var/log/messages
中出现SSD写入量激增警告)。
原因分析:SSD的随机写入性能虽优于机械硬盘,但仍远低于物理内存;频繁的Swap操作会加速SSD磨损。
解决方案:
swapoff -a
并删除/etc/fstab
中的Swap配置)。/dev/sda1
而非/dev/sdb1
);或使用zram
(内存中的压缩Swap设备),执行sudo modprobe zram
加载模块,echo lz4 > /sys/block/zram0/comp_algorithm
设置压缩算法,echo 4G > /sys/block/zram0/disksize
设置Swap大小,mkswap /dev/zram0
格式化,swapon /dev/zram0
启用,可显著减少磁盘I/O。