1. 首页
  2. 乐青映射 | LoCyanFrp
  3. 技术回顾:最黑心 Frp - Golang Rate Limiter 单位换算

技术回顾:最黑心 Frp - Golang Rate Limiter 单位换算

  • 发布于 2026-01-05
  • 150 次阅读

LoCyanFrp 升级 v3 后出于对数据维护的方便性,将数据库内存储的限速信息单位改成了 Mbps 方便进行管控,但是出现了一些小问题

以下是我们纯净版客户端原先的限速代码:

// Rate Limiter 的默认单位是 Byte/s
lr := rate.NewLimiter(rate.Limit(float64(ctl.inboundLimit)/8), int(ctl.inboundLimit)/8)
lw := rate.NewLimiter(rate.Limit(float64(ctl.outboundLimit)/8), int(ctl.outboundLimit)/8)

可以发现我们对传入的数据进行了 / 8,在旧版本当中该计算是正确的,因为数据库内存储的单位是 bit/s,/ 8 是正确计算到 Byte/s 的计算方式,但是改变数据存储方式后相关的代码并没有进行更改,于是造成了

显示的数值与实际场景中限制的速率误差达到了 1,000,000 倍,这也是近期用户存在大量速率低下情况的原因

实际修复的话也很简单,在原先代码的基础上加个 * 1_000_000 就可以了,就像下面这样

lr := rate.NewLimiter(rate.Limit(float64(ctl.inboundLimit) / 8 * 1_000_000), int(ctl.inboundLimit) / 8 * 1_000_000)
lw := rate.NewLimiter(rate.Limit(float64(ctl.outboundLimit) / 8 * 1_000_000), int(ctl.outboundLimit) / 8 * 1_000_000)

单位偏差说明

  • 旧单位:bit/s(如 100000000 表示 100 Mbps)

  • 新单位:Mbps(如 100 表示 100 Mbps)

由于代码未同步更新

  • 期望限制:10 Mbps / 8 ≈ 1.25 MB/s

  • 实际限制:10 bps / 8 = 1.25 Byte/s

Byte/s 与 MB/s 存在 1,000,000 倍的速率差距

希望各位友商和用户在写代码的时候引以为戒,相关修复会尽快上线