如何快速解决CentOS系统中Swap资源占用过高的问题?
- 内容介绍
- 文章标签
- 相关推荐
为什么CentOS程序的Swap资源会被占满?不过,
当你发现服务器变得异常缓慢、应用响应延迟、甚至出现OOM杀死进程时很可能是因为物理内存不足。程序被迫频繁使用Swap分区。此时Swap使用率飙升,直接拖慢磁盘I/O,导致整体性能骤降。
典型痛点
- 内存不足导致频繁换页:程序卡顿、响应时间变长。
- 磁盘I/O激增:Swap读写消耗大量IOPS,影响其他服务。
- 业务不稳定:关键进程可能被OOM killer终止。怎么说呢,
- 运维压力大:需要频繁登录机器查看top/free,手动干预。
快速定位占用Swap最高的进程
先用以下命令找出“罪魁祸首”:
# 查看每个进程的Swap使用量。并按降序排列
awk '{printf "%-10s %-6s %-8s %s
",$1,$2,$6,$0}' /proc/*/status 2>/dev/null |
grep -E 'VmSwap|Name|Pid' |
awk '/VmSwap/{swap=$2;
pid=$1} /Name/{name=$2} /Pid/{if printf "%-6s %-8s %6s KB %s
",pid,name,swap,$0}' |
sort -k4 -nr | head -n 10
或者更简洁的方式:
ps aux --sort=-%mem | head -n 10 # 按内存使用率排序。往往也是Swap大户
free -h # 查看整体内存/Swap使用情况
立即缓解Swap压力的急救方案
1. 暂时关闭并重新启用所有Swap分区
- 这样可以强制程序把目前驻留在Swap中的数据写回内存,随后重新挂载Swap。
sudo swapoff -a # 关闭所有swap
sleep 10 # 给程序一点时间把数据回写
sudo swapon -a #
启用swap
2. 调整Swappiness参数
- 默认值通常是60。调低到10~20可以显著减少Swap的使用频率。
# sudo sysctl vm.swappiness=10 # 生效直至下次重启
# sudo sysctl -p # 若已写入/etc/sysctl.conf则立即生效
- 永久生效:在/etc/sysctl.conf中添加或修改vm.swappiness = 10
.cleanup 高占用swap的进程
- 若确认某个进程异常占用大量swap且可以安全重启,可直接杀掉。
# sudo kill -9 # 用上面找到的PID替换
# free -h # 检查swap是否下降
# sudo yum install zram-config # CentOS 7/8 已有此包
# sudo systemctl enable zram-config
# sudo systemctl start zram-config
# cat /sys/block/zram0/disksize # 查看分配的压缩空间大小
- .定期检查`free -h`、`vmstat`、`iostat`等指标;话说回来,..设置报警阈值;..审计业务代码与容器配置,排除内存泄漏;..对Java、Python等语言调整堆栈大小或GC策略;..保持程序及内核更新,以获得更好的页面回收算法。,
为什么CentOS程序的Swap资源会被占满?不过,
当你发现服务器变得异常缓慢、应用响应延迟、甚至出现OOM杀死进程时很可能是因为物理内存不足。程序被迫频繁使用Swap分区。此时Swap使用率飙升,直接拖慢磁盘I/O,导致整体性能骤降。
典型痛点
- 内存不足导致频繁换页:程序卡顿、响应时间变长。
- 磁盘I/O激增:Swap读写消耗大量IOPS,影响其他服务。
- 业务不稳定:关键进程可能被OOM killer终止。怎么说呢,
- 运维压力大:需要频繁登录机器查看top/free,手动干预。
快速定位占用Swap最高的进程
先用以下命令找出“罪魁祸首”:
# 查看每个进程的Swap使用量。并按降序排列
awk '{printf "%-10s %-6s %-8s %s
",$1,$2,$6,$0}' /proc/*/status 2>/dev/null |
grep -E 'VmSwap|Name|Pid' |
awk '/VmSwap/{swap=$2;
pid=$1} /Name/{name=$2} /Pid/{if printf "%-6s %-8s %6s KB %s
",pid,name,swap,$0}' |
sort -k4 -nr | head -n 10
或者更简洁的方式:
ps aux --sort=-%mem | head -n 10 # 按内存使用率排序。往往也是Swap大户
free -h # 查看整体内存/Swap使用情况
立即缓解Swap压力的急救方案
1. 暂时关闭并重新启用所有Swap分区
- 这样可以强制程序把目前驻留在Swap中的数据写回内存,随后重新挂载Swap。
sudo swapoff -a # 关闭所有swap
sleep 10 # 给程序一点时间把数据回写
sudo swapon -a #
启用swap
2. 调整Swappiness参数
- 默认值通常是60。调低到10~20可以显著减少Swap的使用频率。
# sudo sysctl vm.swappiness=10 # 生效直至下次重启
# sudo sysctl -p # 若已写入/etc/sysctl.conf则立即生效
- 永久生效:在/etc/sysctl.conf中添加或修改vm.swappiness = 10
.cleanup 高占用swap的进程
- 若确认某个进程异常占用大量swap且可以安全重启,可直接杀掉。
# sudo kill -9 # 用上面找到的PID替换
# free -h # 检查swap是否下降
# sudo yum install zram-config # CentOS 7/8 已有此包
# sudo systemctl enable zram-config
# sudo systemctl start zram-config
# cat /sys/block/zram0/disksize # 查看分配的压缩空间大小
- .定期检查`free -h`、`vmstat`、`iostat`等指标;话说回来,..设置报警阈值;..审计业务代码与容器配置,排除内存泄漏;..对Java、Python等语言调整堆栈大小或GC策略;..保持程序及内核更新,以获得更好的页面回收算法。,

