htop显示swp快满了,怎么解决?

看到 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_MEMPERCENT_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)的占用百分比以及主要占用进程,我可以给你更具体的优化建议。

Comments

No comments yet. Why don’t you start the discussion?

发表回复