2016-11-02 5 views
3

J'ai un utilitaire golang qui télécharge beaucoup de données via https à OpenStack Object Storage. Je l'utilise sur Ubuntu Linux, et je voudrais m'assurer que sa bande passante maximale ne dépasse pas 2 500 Ko/s, de préférence sans affecter les autres utilisateurs sur le même système (ralentissement de l'interface Ethernet).Comment puis-je limiter le débit d'un téléchargement HTTP http golang?

Comment puis-je faire cela, de préférence sans modifier mon code source? J'ai essayé quelques approches à ce jour:

  1. Traffic Shaping: Je suis incapable de comprendre les techniques de mise en forme réseau approprié d'affecter un seul processus, même si je sais que cela devrait être possible avec iptables et tc. Toute orientation sur la façon de le faire serait appréciée. Mon expérience de réseautage n'est pas très étendue.
  2. Limitation de débit: J'ai essayé d'utiliser le paquet flowrate pour aller limiter mes écritures au téléchargement. Cela n'a eu aucun effet discernable. Je pense que cela ne fonctionne pas parce que la méthode github.com/ncw/swift.ObjectCreateFile.Write() ne télécharge pas les données telles qu'elles sont reçues, mais plutôt quand elles sont fermées. Je pourrais me tromper à ce sujet si.
  3. filet: J'ai essayé la commande trickle, mais il est pas compatible avec executables de golang (voir this question)
+0

Peut-être regarder dans [ionice] (https://linux.die.net/man/1/ionice) –

+0

ionice fonctionnerait si la machine que j'exécute était la seule machine sur le réseau. En l'état, je ne veux pas inonder le réseau de trafic. Je sais qu'il existe des solutions d'équilibrage de réseau capables de gérer cette fin, mais ce n'est pas une option pour moi. Je dois limiter mon utilisation, plutôt que ma priorité io. Cela étant dit, ionice serait un bon ajustement sous différentes contraintes. –

+0

peut-être essayer «importer» C "' pour déclencher la liaison dynamique? Ce http://blog.hashbangbash.com/2014/04/linking-golang-statically/ montre un exemple et comment la libc est alors liée - peut-être que trickle fonctionnerait alors. – danmux

Répondre

2

il se avère que vous pouvez envelopper le processus golang dans un Doc ker container, puis rate-limit l'interface réseau du conteneur Docker (depuis l'intérieur du conteneur) avec l'utilitaire tc. Voir this answer pour un exemple Dockerfile à faire exactement cela.

1

Si vous pouvez contrôler la façon dont vous exécutez réellement l'utilitaire, vous pouvez utiliser filet

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

Voici quelques documents supplémentaires à ce sujet https://wiki.archlinux.org/index.php/Trickle

+1

J'ai essayé le filet et il n'est pas compatible avec les exécutables golang. Voir [cette réponse] (http://stackoverflow.com/a/40387514/7106084) pour plus de détails. Merci pour la suggestion cependant. –

+0

Désolé d'entendre ça! J'essaierais probablement de créer une règle iptables pour marquer les paquets envoyés par votre processus et ensuite utiliser tc pour former le trafic étiqueté par cette règle, mais je suis incapable de vous fournir une solution exacte pour le moment. – Nebril