如何从外部限制 golang http 上传的速率?

How can I externally rate-limit a golang http upload?

我有一个 golang 实用程序,可以通过 https 将大量数据上传到 OpenStack 对象存储。我是运行它在UbuntuLinux,我想保证它的最大上传带宽不超过2,500KB/s,最好不影响同系统的其他用户(即减慢以太网接口)。

我该怎么做,最好不要更改我的源代码?到目前为止,我已经尝试了几种方法:

  1. 流量整形:我一直无法找出适当的网络整形技术来影响单个进程,尽管我知道 iptables 应该是可能的和 tc。任何有关如何执行此操作的指导将不胜感激。我的网络背景不是很广泛。
  2. 流量限制: 我尝试使用 flowrate package in go to rate-limit my writes to the upload. This didn't have any discernable effect. I think this doesn't work because the github.com/ncw/swift.ObjectCreateFile.Write() 方法不在收到数据时上传数据,而是在关闭时上传数据。不过我可能搞错了。
  3. trickle: 我尝试了 trickle 命令,但它与 golang 可执行文件不兼容(参见

如果您可以控制实际 运行 实用程序的方式,则可以使用 trickle

sudo apt-get install trickle #since you're on Ubuntu
trickle -u (upload limit in KB/s) -d (download limit in KB/s) executable

这里有一些关于它的附加文档https://wiki.archlinux.org/index.php/Trickle

事实证明,您可以将 Golang 进程包装在 Docker 容器中,然后使用 tc 对 Docker 容器的网络接口(从容器内部)进行速率限制] 公用事业。请参阅 示例 Docker 文件来执行此操作。