如何规划一台安静、低功耗的常开 VPN 服务器
一台安静的 VPN 主机要看待机瓦数、负载噪声,以及它是否始终可达。买零件之前,先把整套系统在三种状态下测一遍。
待机是家用 VPN 主机度过几乎全部寿命的状态,所以最值得测量的正是这个状态。同一台机器在隧道开着时仍要应答连接、提供文件并完成备份,而这三件事的拉扯方向并不相同。安静、低功耗和始终可达是三种彼此独立的属性,规格表对它们一概不谈。按顺序做完下面的检查,一次硬件决定就不会在半年后变成返工。
从角色入手,而不是从零件入手
把没人盯着时这台机器必须干的活全部写下来。WireGuard 或 OpenVPN 网关、文件共享、备份目标和索引任务,各自的稳态开销并不相同,一台机器全包四件事,其下限远高于只做第一件。待机功耗是这些下限之和,而不是它们的平均值。这就是为什么同一个房间里两台都被称为低功耗的主机,可能相差三倍。
数据是否与隧道同宿,这个决定越早做出,对后面一切的约束就越清楚。分开的主机意味着两份待机功耗,但网关在存储休眠时仍然醒着;单主机则意味着单一功耗和单一故障域。两者都不算错,但答案必须在零件清单出现之前写下来。
在三种状态下测整机
插座与电源之间的墙插功率计是这里唯一诚实的仪器,因为它把转换损耗、磁盘起转和你忘掉的每个 USB 设备都算进去。记下三个数字:隧道开着、别的都不跑时的待机;同一台机器在实际远程传输时;以及它在一场定时备份中的表现。
软件计数器有助于解释墙插读数,但替代不了它。RAPL 接口报告的是封装与内存域的能量,不含电源损耗和任何走 USB 的设备。
read -r a < /sys/class/powercap/intel-rapl:0/energy_uj; sleep 60; read -r b < /sys/class/powercap/intel-rapl:0/energy_uj
awk -v a="$a" -v b="$b" 'BEGIN{printf "package average: %.1f W\n", (b-a)/60/1000000}'
噪声也要同样的对待。无风扇机箱去掉了一个声源,却留下硬盘、电源和线圈啸叫,所以要在备份时听,而不是在登录提示符前听。温度属于同一轮:在持续负载下读传感器,并且绝不要为了更安静而关闭热保护。
把瓦数换算成可比较的一年
持续功耗乘一次就能变成电量,算一次就不会被年度电费打个措手不及。全年 11 W 的示例平均值是这样算出来的。
awk 'BEGIN{printf "%.1f kWh/year at 11 W\n", 11*24*365/1000}'
这个数字是算术,不是对你那台机器的测量,而乘上去的电价对结果的影响,比几瓦更大。这个计算真正的用处是比方案:待机 6 W 的网关对 15 W 的网关,是一个可以标价的决定。处理器的额定功耗不是这个数,因为它描述的是负载下的封装,而不是静置的系统。用墙插功率计的平均值配上当地电价,并把结果标注为估算。
决定是否允许休眠
休眠最省电,也打破最多假设。睡着的主机无法接住本该把它唤醒的入站连接,客户端 keepalive 也改变不了这一点;只有同一局域网里常开的设备才能发出 wake-on-LAN 包。
如果隧道必须随时可达,就把休眠当作策略性禁用,并写进搭建笔记。掩掉目标很粗暴,但它明确,而且比习惯更能扛住软件包升级。
systemctl status sleep.target suspend.target
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
systemd-inhibit --list
Wake-on-LAN 值得在那些笔记里单列一行,因为它是静默失败的。这个功能必须在固件里启用,只在部分网卡上有效,而且需要一台已经醒着的设备来发包。在依赖它之前先测,不要等出门回来再测。
在它真正会遇到的负载下验证
最后一项检查恰恰是人会跳过的:跑起预期负载,盯它一小时。远程传输、备份和索引重建同时进行,就能看出散热、链路和存储在不在你选的角色组合下撑得住。
uptime
sensors | grep -E 'Core|Package|fan'
ss -s
同一个窗口里也要看接入链路,因为上行带宽通常远早于处理器成为远程吞吐的瓶颈。如果隧道在 CPU 加密能力的零头处就饱和,更快的芯片什么也买不到。