Hysteria2速度慢怎么办?bandwidth设置不当反而更慢
Hysteria2 连得上、但速度比预期慢很多,先别急着怀疑服务器线路。这个协议有个和别的协议不太一样的地方:你在配置里有没有写 bandwidth,会直接决定它用哪种拥塞控制算法。很多人为了"跑满带宽"把数字填得很大,结果反而更慢,下面按官方文档把这件事讲清楚,再说其他几个常见原因。配置怎么写、客户端怎么连,前面两篇有讲:服务端 config.yaml、客户端导入连接。
第一步:看客户端有没有写 bandwidth
客户端配置里长这样的一段:
1 | bandwidth: |
按官方文档的说法,写了 bandwidth 的方向就会启用 Brutal 拥塞控制,也就是按你填的速度硬推流量,丢包时还会尝试比设定值稍快一点发送来补偿;不写或者删掉整段,就使用默认的 BBR,让算法自己探测线路能跑多快。上行、下行是分别判断的。
官方对这个值的提醒很直接:不是越大越好,千万别超过当前网络真正能支持的最大带宽,否则会适得其反,造成拥塞和连接不稳定。
所以速度慢时最快的排查方法就是:
- 先把客户端的
bandwidth整段删掉,用 BBR 测一次速。 - 如果比之前快,说明之前填的数字超过了线路实际能力,要么保持不填,要么改成接近你实测带宽的值。
- 如果删掉后更慢,再去填一个贴近实测的值,不要凭感觉往大了填。
up 是客户端上传,down 是客户端下载。图形客户端里一般也有对应的上传、下载带宽两栏,导入链接时如果客户端自动填了很大的默认值,也要留意。
如果担心丢包导致 Brutal 发得太猛,客户端还有一个 disableLossCompensation 选项,开启后只按设定速度发送,不再多发来补偿丢包,官方说明这个选项只对本端生效。
第二步:看服务端有没有限速
服务端配置里也有 bandwidth,但含义不同:它是对每个客户端的限速,不写或者写 0 就是不限制。官方特别说明了方向:服务端的上传速度就是客户端的下载速度,反过来也一样。所以如果你的服务端配置里写过类似 up: 10 mbps 的值,客户端的下载就会被卡在这个速度上。
1 | bandwidth: |
排查时直接确认服务端配置文件里有没有这段,没有特殊需要就删掉。
另外服务端还有一个 ignoreClientBandwidth 选项,开启后服务端会无视客户端填的带宽值,强制使用非 Brutal 的拥塞控制。官方说它主要给想让流量对其他网络流量更公平、或者不信任用户自己填的带宽值的服务器管理者用,自己一个人用的话一般不需要打开。
第三步:调大系统的 UDP 缓冲区
官方的性能调优页面建议,Linux 上把 UDP 的收发缓冲区都设成 16 MB:
1 | sysctl -w net.core.rmem_max=16777216 |
这样设置重启就失效了,想长期生效就写到配置文件里:
1 | cat > /etc/sysctl.d/99-hysteria.conf <<'EOF' |
服务端和客户端所在的机器都可以这样设。缓冲区太小在高速或高延迟线路上,会让 UDP 包来不及收而被丢掉。
第四步:QUIC 窗口和进程优先级(一般不用动)
官方还提供了几个 QUIC 流控窗口的参数,比如 initStreamReceiveWindow、maxConnReceiveWindow 等,默认值是单个流 8 MB、整个连接 20 MB。官方给的建议是保持流窗口和连接窗口大约 2:5 的比例,避免某一个卡住的流占满整个连接。默认值本身就满足这个比例,没有明确理由不用改,乱调反而可能出问题。
进程优先级方面,官方给了用 systemd 把服务的 Nice 值设成 -5 的做法,也提醒了实时调度会影响其他进程的响应,要先小幅调整测试。这条对大部分场景提升有限,放在最后再考虑。
第五步:判断是不是线路本身的问题
上面几项都排除了还是慢,就要考虑线路。这一条官方文档里没有明确说明,是实际使用中常见的情况,没有官方依据,请当作经验参考:部分网络环境对 UDP 流量的处理不如 TCP,高峰时段 UDP 可能被限速或者丢包更多。
判断方法很简单,在同一台服务器上同时搭一个基于 TCP 的节点,比如 VLESS Reality,在相同时间、相同网络下分别测速:
- TCP 节点明显更快、Hysteria2 慢,而且删掉
bandwidth也没改善,问题更可能在这条线路上对 UDP 的处理。 - 两个都慢,那是服务器线路或本地网络本身的问题,换协议没用。
也可以对比同样基于 QUIC/UDP 的 TUIC 节点,看是不是 Hysteria2 特有的现象。换端口、换时间段多测几次,比只测一次可靠得多。
速度慢排查清单
- 客户端
bandwidth先删掉,用 BBR 对比一次。 - 服务端
bandwidth有没有填了偏低的限速。 - UDP 缓冲区是否按官方建议设为 16 MB。
- 用 TCP 协议和 TUIC 做对照,判断是不是线路问题。
- 连不上或者握手失败是另一类问题,对照客户端导入那篇的排查顺序。