I have a golang utility that uploads a lot of data via https to OpenStack Object Storage. I'm running it on Ubuntu Linux, and I would like to ensure that its maximum upload bandwidth does not exceed 2,500KB/s, preferably without affecting other users on the same system (i.e. slowing down the ethernet interface).
How can I do this, preferably without altering my source code? I've tried a few approaches so far:
iptables
and tc
. Any guidance on how to do this would be appreciated. My networking background isn't very extensive.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()
method doesn't upload the data as it is recieved, but rather when it is closed. I could be mistaken about this though.trickle
command, but it isn't compatible with golang executables (see this question)It turns out that you can wrap the Golang process in a Docker container and then rate-limit the Docker container's network interface (from inside of the container) with the tc
utility. See this answer for an example Dockerfile to do just that.
If you can control how you actually run the utility, you can use 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
Here is some additional documentation about it https://wiki.archlinux.org/index.php/Trickle