看到 htop里 Swap 快满了,说明物理内存(RAM)已经不够用,系统正在频繁使用硬盘做虚拟内存,这会导致性能急剧下降(卡顿、IO 等待飙升)。别慌,按以下步骤快速排查和解决。
紧急缓解:立即释放 Swap
如果系统已经卡死,先执行这两条命令救急,能快速释放一部分 Swap 和缓存:
# 1. 清除页面缓存(不影响正在运行的程序)
sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
# 2. 尝试主动将 Swap 中的数据换回内存(如果内存有空闲)
sudo swapoff -a && sudo swapon -a
注意:第二步(
swapoff)在内存极度紧张时可能导致系统短暂卡死,仅在服务器可接受短暂停顿时执行。
第二步:定位“元凶”
在 htop中按 F6,选择 PERCENT_MEM或 PERCENT_SWAP排序,直接找出占用内存/交换空间最大的进程。常见凶手通常是:
- Java 应用(如 Elasticsearch、Jenkins)
- 数据库(MySQL、PostgreSQL)
- 浏览器(Chrome 多标签页)
- 失控的 Python/Node.js 脚本
第三步:根本解决方案
1. 物理内存不足(最常见)
如果 htop顶部的内存条也长期接近 100%,说明 RAM 真的不够用了。
- 短期:杀掉占用过大的非核心进程(在
htop中选中进程按F9发送SIGKILL)。 - 长期:增加物理内存是最有效的解决方案。
2. 调整 Swappiness 参数
Linux 默认倾向过早使用 Swap(vm.swappiness=60)。如果你内存紧张但 SSD 较慢,可以调整为更激进地使用内存而非 Swap:
# 查看当前值
cat /proc/sys/vm/swappiness
# 临时设置为 10(仅当内存使用超过 90% 时才用 Swap)
sudo sysctl vm.swappiness=10
# 永久生效(写入文件)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
3. 增加 Swap 空间(临时救急)
如果磁盘空间充足,可以扩大 Swap 文件(假设已有 /swapfile):
# 1. 关闭现有 Swap
sudo swapoff /swapfile
# 2. 调整大小(例如调整为 4GB)
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
# 3. 重新启用
sudo mkswap /swapfile
sudo swapon /swapfile
监控与验证
执行完操作后,在 htop中观察 SWP条是否下降,或者使用终端命令持续监控:
# 实时监控内存和 Swap 变化
watch -n 1 "free -h && echo && swapon -s"
重要提醒
- Swap 满 ≠ 系统崩溃:Linux 允许 Swap 耗尽,但此时系统会变得极慢,OOM Killer 可能会随机杀死进程来释放内存。
- SSD 磨损:频繁的 Swap 读写会严重磨损 SSD,长期高负载环境下建议优先升级物理内存。
- 数据库服务:如果 Swap 满的是数据库服务器,重启数据库服务通常是最快的恢复手段(先确认有备份)。
如果你能提供 htop顶部内存条(Mem)的占用百分比以及主要占用进程,我可以给你更具体的优化建议。