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 倍的速率差距
希望各位友商和用户在写代码的时候引以为戒,相关修复会尽快上线