使用 Netty 按百分比限制服务器带宽

Throttle server bandwidth by percentage using Netty

是否可以使用 Netty 限制服务器的全局或通道带宽?

我可以通过 GlobalChannelTrafficShapingHandler 设置明确的读取或写入速率限制,但我试图将服务器的全局带宽限制为可用带宽的大约一半。所以如果服务器可以以 8MB/s 的速度上传,我想将上传限制在大约 4MB/s。我希望服务器随着可用带宽的变化而调整;所以如果服务器的上传速率降低到 5MB/s(可能是由于其他应用程序使用网络),那么我想将速率限制为大约 2.5MB/s。

我一直在尝试覆盖 AbstractTrafficShapingHandler.submitWrite() 并根据上次调用后的持续时间添加延迟,但逻辑似乎脆弱且不可靠。

关于如何智能地解决这个问题有什么想法吗?

您是否考虑过使用 GlobalTrafficShapingHandler 并定期让它全速运行以确定服务器最大带宽,然后将其限制为该带宽的一半?

我会定期执行以下操作(按计划,每分钟可能有 1 秒)

  • setReadLimit setWriteLimit 增加到您允许的最大值
  • 使用 GlobalTrafficShapingHandlers TrafficCounter(通过 public trafficCounter())通过调用 resetCumulativeTime
  • 重置计数
  • 确保 TrafficCounter 的间隔短于或等于您要采样的时间。使用 TrafficCounter.configure(long)
  • 更改此设置
  • 对 TrafficCounter 进行采样以获得服务器最大带宽
  • 修改 GlobalTrafficShapingHandler 以使用刚刚计算的带宽的一半

我认为以上内容应该可以满足您的需求,又不会太脆弱。