过程
是这样的,我最近需要跑一些常驻的服务,比如 AdGuard、HomeAssistant 等,于是掏出了 10 年前的树莓派 3B+,装了最新的 bookworm 系统。
一开始没什么问题(复盘发现只是我没碰上),有一天我晚上要用手机回个消息,然后我发现断网了,我刚开始以为是电信日常的重拨,之后发现其他设备都正常啊,怎么就手机连不上,第一时间就想到是 AdGuard 出了问题,因为我只给手机加了 DNS 反广告。
电脑上一查,确实,AdGuard 页面打不开了,于是我就 ssh 上去看看问题,结果 ssh 也连不上,上路由器后台一看,设备列表里都没他了,那只好试试网线了,结果网线接上去也没反应,连不上,只好强制重启。
重启过后一切正常,什么问题都消失了,这时候我的猜想是偶发性的,某个应用死循环了,把 CPU、内存等资源吃满了,所以系统高负载服务都未响应了。
后来第二天、第三天晚上都出现了这个问题,这已经不是偶发性的了,就算是应用出 BUG,那也是严重 BUG 了,于是我把当时的嫌疑应用 AdGuard 给停了,但第四天依然出现,后面甚至变成了无法正常开机的情况,点亮后一直无法联网。
于是我找了一条 HDMI 线,插上屏幕,屏幕能点亮,能进系统,但是鼠标、键盘全失效,没有反应,这时候我懵逼了,我开始怀疑是树莓派出问题了,毕竟用了 10 年,所以我下单了 PI 5。
同一张 tf 卡,插入 PI 5 之后是能正常使用的,我一开始以为事情就这样解决了,但第二天依然出现了无法连接的问题,由于我用的是金属外壳,被动散热的,在出问题的时候设备会变得很烫,大概 50 度。
我开始怀疑是系统问题,于是备份后重新安装了系统,使用了 Lite 版,一开始我没有安装 Docker 等应用,放了一天,没有复现(这里我测试的时候有些纰漏,只查了温度,没看路由器设备列表)。
随后我第三天晚上继续安装了 HomeAssistant 等容器,也没有出现问题,但到第四天的时候,问题又来了,新安装的应用和 3B+ 上的完全不一样,所以我这时候排除了应用 BUG 的可能,或者说不是应用主导的问题。
现在又回到了系统负载上,这个点很难去搜索,太广泛了。正当我头疼的时候,我想到了一个角度:
会不会是因为网络断连,所以导致一些应用反复重连/自检,从而进入死循环,然后引发系统高负载发烫呢?
于是我用“树莓派 网络自动断连”这种关键词去搜索,还真给我搜到了一个特性,那就是树莓派他默认是有 WiFi 休眠的,你长时间不用,他就会把 WiFi 断掉,为了省电,但如何恢复,在 headless 环境中我真想不到(没有网络,也没有 GUI)。
用命令 iw wlan0 get power_save
检查休眠状态,确实是开启的,用命令 iw dev wlan0 set power_save off
禁用后只是当前环境生效,如果要永久禁用,按 StackOverflow 的解决办法是创建一个新服务,让这个服务开机启动,自动运行禁用休眠的命令。
事实上,到这一步事情还没有完全结束,休眠的问题解决了,早上起来设备确实没有发烫,但是 ssh 连接依然很慢,不过也不至于上不去,输入的时候也会有些卡顿,查了半天,又是设置 QoS,又是设置 ssh 不使用 DNS,还是解决不了。
后来我尝试 ping
了一下,发现在局域网内的延迟都有 5ms,那估计是信号不好了。
在我无头绪乱投医的时候,我注意到一个可能的问题,如果你认真看了前文,你可能也会注意到,我 PI 5 的壳是金属的,被动散热,除了底部是塑料,他就是一个金属盒子,然后我用的又是 WiFi 联网,就有可能是外壳屏蔽了信号。
说实话到这一步我已经无语了,这已经不是改设置就能解决的,感觉之前的努力都白费了,只能掏出网线,老实使用有线连接,之后经过测试,有线连接后 ping 的延迟小于 1ms,是正常水平。
服务
sudo systemctl --full --force edit [email protected]
# [email protected]
[Unit]
Description=Set WiFi power save %i
After=sys-subsystem-net-devices-wlan0.device
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/iw dev wlan0 set power_save %i
[Install]
WantedBy=sys-subsystem-net-devices-wlan0.device
# ----------------------
sudo systemctl disable [email protected]
sudo systemctl enable [email protected]
总结
经过我后面复盘,大概是这么几点:
- 树莓派 3B+ 确实是坏了,也有可能是那几天的高温导致的
- 此前(几年前)用的时候为什么没发现休眠?因为之前都是连接网线的
- 问题原因为系统默认开启的 WiFi 休眠
- 金属壳会屏蔽信号,别想着用 WiFi 了
吐槽
你说 3 拿来当低功耗的硬件使用也就算了,5 性能比 3 强那么多,还要求 35w 电源,你官方怎么能默认把他当做低功耗设备来配置啊?这合理吗?