解决 Ubuntu 锁屏导致 llama.cpp RPC 失效:从 tmux 到 Wi-Fi 省电模式的排查之路

解决 Ubuntu 锁屏导致 llama.cpp RPC 连接失效的问题。通过排查发现罪魁祸首竟是 Wi-Fi 省电模式,并提供了永久修复方案。

问题背景

在使用双机(MacBook + Ubuntu AI Server)进行 llama.cpp RPC 分布式推理时,遇到了一个非常诡异的问题:只要 Ubuntu 机器进入锁屏状态,远程 RPC 连接就会失效。

尽管我并没有设置系统自动休眠(suspend),但锁屏后,客户端就再也无法通过 RPC 调用服务器端的推理服务了。

走过的“错路”

在解决这个问题之前,我尝试了多种思路,但都证明是“错误方向”:

  1. 怀疑系统进入了 Suspend (休眠)
    尝试检查 systemctl status sleep.target,但系统并未进入休眠,进程仍在运行。
  2. 怀疑 Terminal 会话被关闭
    使用了 tmux 来运行 llama-server,试图防止 GUI Session 锁屏导致终端进程挂起,但即便在 tmux 中,RPC 依然会断开。这意味着问题不在于终端会话的生命周期,而在于更底层的网络或硬件状态。
  3. 怀疑 GPU Context 丢失
    锁屏时观察 nvidia-smi,发现 GPU 并没有因为锁屏而重置或释放显存,进程依然可以正常访问 GPU。

真正的原因:Wi-Fi Powersave

经过排查,问题的根源在于 Ubuntu 的 Wi-Fi 省电模式 (Power Management)

当 Ubuntu 进入锁屏状态时,系统会触发一系列节能策略,其中之一就是让无线网卡进入低功耗模式。对于 llama.cpp RPC 这种极其依赖长连接 (Long-lived TCP connection) 的协议来说,Wi-Fi 省电导致的延迟增加或短暂的网络静默,会直接导致 TCP 连接被静默切断(Silently broken)。

解决方案

通过禁用 Wi-Fi 的省电模式,问题得到了完美解决。

0. 确认你的网卡名称

在操作之前,你需要先确认你的无线网卡接口名称(Interface Name)。请在终端执行:

iw dev

你会看到类似以下的输出:

Interface wlan0
    wdev 0x...
...
# 或者
Interface wlp2s0
    ...

请记住这个名字(例如 wlan0wlp2s0),接下来的命令需要替换它。

1. 临时测试(立即生效,重启失效)

使用 iw 工具直接关闭当前网卡的省电功能(将 wlan0 替换为你的实际网卡名):

sudo iw dev wlan0 set power_save off

然后验证是否成功:

iw dev wlan0 get power_save

如果显示 Power save: off,说明设置成功。现在你可以尝试锁屏测试 RPC 是否还掉线。

2. 永久生效(推荐)

为了保证重启后依然有效,建议修改 NetworkManager 的配置:

  1. 创建或编辑配置文件:
    sudo nano /etc/NetworkManager/conf.d/wifi-powersave.conf
  2. 写入以下内容:
    [connection]
    wifi.powersave = 2

    (注:2 代表禁用 powersave)

  3. 重启 NetworkManager 使配置生效:
    sudo systemctl restart NetworkManager

总结与进阶建议

如果你在构建 AI 推理服务器,除了修复 Wi-Fi 问题,还可以考虑方案以获得更高的稳定性:

  • 优先使用有线网络:物理链路的稳定性永远是第一位的。
  • 使用无头模式 (Headless):尽量使用 Ubuntu Server,避免 GUI/Wayland/NVIDIA 组合带来的玄学问题。
  • 使用 systemd 管理服务:将 llama-server 配置为 systemd service,并设置 Restart=always,以应对驱动或网络抖动。

Leave a Reply

Your email address will not be published. Required fields are marked *