Skip to content

从 kswapd0 高负载到 OpenClaw 稳定运行:2核2G服务器内存优化实战

一、问题现象

在 2 核 2G 的云服务器上运行 OpenClaw(一个支持多平台消息接入的聊天机器人框架),经常遇到:

  • 登录 QQ 或连接服务时超时、失败;
  • 服务器响应缓慢,kswapd0 进程长时间占用高 CPU(超过 20% ~ 50%);
  • 服务偶尔被系统 OOM Killer 杀掉,需要手动重启。

二、根本原因分析

kswapd0 是 Linux 内核的交换守护进程,当物理内存不足时,它会将不活跃的内存页换出到磁盘(swap),以释放内存给活跃进程。kswapd0 持续高 CPU 占用,说明系统频繁进行内存回收,即物理内存严重不足

在 2G 物理内存的服务器上,运行 Node.js 应用(如 OpenClaw)很容易触及内存上限,尤其当没有合理配置 swap 和 Node.js 堆内存时,系统会陷入频繁换页甚至 OOM 的困境。

三、排查与优化步骤

1. 检查当前内存与 swap 状态

bash
free -h
swapon --show

输出示例:

              total        used        free      shared  buff/cache   available
Mem:          1.6Gi       1.1Gi       312Mi       3.5Mi       374Mi       532Mi
Swap:         1.0Gi          0B       1.0Gi
  • 物理内存可用仅 532MB,压力很大。
  • Swap 仅有 1GB,不足以提供足够的缓冲。

2. 扩容 Swap 文件至 4GB

bash
# 关闭旧 swap(路径为 /www/swap)
swapoff /www/swap

# 创建新 swap 文件
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

fallocate 不支持,可使用 dd 替代:

bash
dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress

3. 永久生效:修改 /etc/fstab

注释掉旧的 swap 行,添加新配置:

/swapfile none swap sw 0 0

4. 调整内核参数,降低对 swap 的依赖

系统默认的 vm.swappiness=60 会倾向于使用 swap。改为 10 可以让系统优先使用物理内存,只有在真正紧张时才换出。

bash
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p

5. 限制 Node.js 堆内存

OpenClaw 基于 Node.js 运行,默认堆内存可能无限制或偏大。设置合理的上限可以避免内存耗尽。

bash
echo 'export NODE_OPTIONS="--max-old-space-size=1200"' >> ~/.bashrc
source ~/.bashrc

这里 1200 表示最大堆内存 1200MB,为系统和其它进程留出约 400MB。

6. 重启 OpenClaw 并验证

bash
openclaw restart
openclaw status
openclaw logs --tail 50

观察日志中是否还有 OOM 或内存错误。

7. (可选)开启轻量化模式

若资源依然紧张,可在配置文件 ~/.openclaw/openclaw.json 中添加:

json
{
  "lite_mode": true
}

此模式会降低内存占用,适合低配机器。

四、优化后的状态验证

bash
free -h
              total        used        free      shared  buff/cache   available
Mem:          1.6Gi       1.0Gi       110Mi       3.5Mi       588Mi       541Mi
Swap:         4.0Gi          0B       4.0Gi
  • Swap 已扩容到 4GB。
  • 物理内存可用空间得到缓解。
  • kswapd0 不再持续高 CPU 占用。

五、总结与建议

  1. kswapd0 高负载是内存不足的信号,不应直接 kill 进程,而应排查根本原因。
  2. 小内存服务器上运行 Node.js 应用,务必设置合理的堆内存上限(通过 NODE_OPTIONS)。
  3. 适当增大 swap 空间(建议为物理内存的 2 倍以上),并调整 vm.swappiness 到较小值(如 10),让 swap 仅作为最后缓冲。
  4. 定期监控内存使用,可以使用 htopfree -h 等工具。
  5. 如果应用支持轻量模式,优先开启,以降低资源消耗。

通过以上步骤,原本在 2C2G 服务器上频繁崩溃的 OpenClaw 变得稳定可靠,QQ 登录与消息收发恢复正常。希望这份实战记录能帮助遇到类似困扰的朋友少走弯路。

MIT