Comment puis-je limiter la bande passante utilisée par un processus?

42

J'ai un serveur CentOS 5.7 qui sauvegardera ses fichiers tous les soirs. Je crains que les visiteurs des différents sites hébergés par le serveur ne voient leurs performances se dégrader lors du transfert de la sauvegarde sur le réseau.

Est-il possible de limiter le débit maximum autorisé d'un processus à une interface réseau? J'aimerais limiter le transfert de fichiers basé sur SSH à la moitié de ma bande passante disponible. Cela pourrait être du côté serveur ou client; c'est-à-dire que je serais heureux de le faire sur le client qui initie la connexion ou sur le serveur qui reçoit la connexion.

(Malheureusement, je ne peux pas ajouter une interface à dédier aux sauvegardes. Je pourrais augmenter mon débit disponible, mais cela signifierait simplement que le transfert réseau s'achèverait plus rapidement, tout en maximisant la capacité totale de la connexion.)


Un peu de fond

Peut-être un peu de contexte est en ordre. En revenant en arrière, je n’avais pas assez d’espace local pour créer la sauvegarde elle-même. Entrez SSHFS! La sauvegarde est sauvegardée sur ce qui est apparemment un lecteur local, de sorte qu'aucun bit de sauvegarde ne soit jamais sur le serveur Web lui-même.

Pourquoi est-ce important? Parce que cela semblerait invalider l'utilisation du vénérable rsync --bwlimit. rsyncne fait pas le transfert ni ne peut le faire car je ne peux même pas ménager de l’espace pour sauvegarder le fichier de sauvegarde.

Je peux vous entendre demander: «Alors, attendez, pourquoi avez-vous même besoin de créer un fichier de sauvegarde? Pourquoi ne pas simplement rsyncles fichiers source et les dossiers?" Parce qu'une chose agaçante appelée "Plesk" est dans le mélange! Il s’agit de mon hébergeur web qui utilise Plesk pour plus de commodité. En tant que tel, j’utilise Plesk pour lancer les sauvegardes, car Plesk ajoute toutes sortes de magie supplémentaire à la sauvegarde, ce qui la rend très sûre lors d’une procédure de restauration.

visage triste

Wesley
la source
1
Une autre possibilité pour ma situation, qui d'ailleurs ne répond pas exactement à la question spécifique, consiste ioniceà limiter les écritures qu'un processus peut générer. Étant donné que j'écris sur un système de fichiers SSHFS, je peux laisser tomber la classe du processus de sauvegarde sur 3 pour le laisser complètement passer à tout autre processus qui souhaite écrire. De cette façon, je produis l'effet que je veux, à savoir ne jamais dégrader l'expérience d'un visiteur du site en raison de la bande passante accablante de sauvegarde.
Wesley
Une question, votre ssh utilise la compression? "Compression oui" à votre .ssh / config?
Zlatko

Réponses:

25

Vous pouvez utiliser iptablespour marquer un paquet (--pid-owner ...), puis utiliser tcpour façonner le trafic. De même, "--sid-owner" peut être utilisé pour inclure les threads et les enfants de ce processus.

http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

Match --pid-owner
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m propriétaire --pid-propriétaire 78
Explication Cette correspondance est utilisée pour faire correspondre les paquets en fonction de l'ID de processus (PID) qui en était responsable. Cette correspondance est un peu plus difficile à utiliser, mais un exemple consisterait uniquement à autoriser le PID 94 à envoyer des paquets à partir du port HTTP (si le processus HTTP n’est bien entendu pas threadé). Alternativement, nous pourrions écrire un petit script qui récupère le PID d'une sortie ps pour un démon spécifique, puis ajoute une règle pour celui-ci. Pour un exemple, vous pourriez avoir une règle comme indiqué dans l'exemple Pid-owner.txt

Mircea Vutcovici
la source
Je pense que cela correspond à ma solution pour la meilleure façon de le faire. --pid-owner ne sélectionne pas réellement en fonction du processus, mais du propriétaire du processus. Je devrais créer un utilisateur spécial pour lancer le processus en tant que, puis filtrer en fonction de ce propriétaire afin de pouvoir m'assurer que le trafic est créé uniquement à partir de ce processus spécifique et non, par exemple, de multiples démons pouvant avoir été lancés. un utilisateur générique.
Wesley
@ Wesley Ce n'est pas ce que dit la page de manuel: " --pid-owner processidCorrespond si le paquet a été créé par un processus avec l'ID de processus donné ." linux.die.net/man/8/iptables
Ajedi32
Cette réponse serait bien meilleure si elle incluait un exemple d'utilisation de iptables et tc à cette fin. L' iptables -A OUTPUT -m owner --pid-owner 78exemple donné ne semble pas être complet (car il ne fait que correspondre aux paquets, il ne dit pas comment les "marquer") et tcn'est pas expliqué du tout.
Ajedi32
Pour marquer un paquet, vous devez ajouter quelque chose comme -j MARK --set-mark 1. Pour plus de détails, voir: wiki.archlinux.org/index.php/…
Mircea Vutcovici
40

Une option que je viens de découvrir est d'utiliser le filet .

compte-gouttes est un formateur de bande passante utilisateur léger et portable. Il peut fonctionner en mode collaboratif (avec des travaux en dérivation) ou en mode autonome.

filet fonctionne en tirant parti du préchargement du chargeur Unix. Il fournit essentiellement à l'application une nouvelle version de la fonctionnalité requise pour envoyer et recevoir des données via des sockets. Il limite ensuite le trafic en retardant l'envoi et la réception de données sur un socket. Traverse s'exécute entièrement en espace utilisateur et ne nécessite pas de privilèges root.

Wesley
la source
1
C'est celui qui a résolu mon problème. J'avais un problème avec le démon bitcoin qui aspirait de façon aléatoire tout mon contenu multimédia lorsqu'un client a décidé que j'étais la personne à partir de laquelle il devrait télécharger toute la blockchain.
Omnifarios
Le tricklelien que vous avez donné mène à un 404.
Geremia
J'ai corrigé le lien cassé (en le remplaçant par un lien Wayback Machine).
G-Man dit 'Réintégrez Monica'
3
Trickle semble être sur github maintenant: github.com/mariusae/trickle
Cheetah
ousudo apt-get install trickle
ggll
22

Si vous pouvez écrire sur un tuyau (ou une stdout), vous pouvez installer la commande pv(visualiseur de tuyaux). Il a été écrit à l'origine pour afficher la progression des données transférées via un canal.

tar cvf - /files/to/backup | pv -L 512k > /your/file/on/sshfs

   -L RATE, --rate-limit RATE
          Limit the transfer to a maximum of RATE  bytes  per  second.   A
          suffix of "k", "m", "g", or "t" can be added to denote kilobytes
          (*1024), megabytes, and so on.
Hhaamu
la source
C'est en fait la réponse que je pense utiliser! Cependant, ce n'est pas exactement une réponse à la question spécifique que j'avais initialement posée. Hélas, la question a été modifiée, mais elle visait toujours à limiter la vitesse du réseau d’un processus. Cependant, vous pouvez contribuer à cette nouvelle question que j'ai posée: unix.stackexchange.com/q/34174/4232
Wesley
Merci! Je faisais la même chose et j'ai fini par le faire ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz.
Clacke
1
On aurait pu le combiner avec ionice également, mais cela n'était pas autorisé sur ce serveur particulier. ssh my-remote-server ionice -c3 bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz
Clacke
6

J'utilise rsync avec l'option --bwlimit = KBPS pour la même raison.

Notre réseau Ethernet 1 Gbit est capable de submerger notre ancien SCAS320 DAS RAID et, en gros, certains de nos anciens boîtiers de production qui en dépendent pour ses magasins NFS.

Magellan
la source
4

Comment transférez-vous les données? (rsync sur ssh? scp? sftp? autre chose?)

rsync vous permettra de limiter la bande passante (voir l'option --bwlimit = KBPS). rsync -e ssh --bwlimit ..

Alternativement, vous pouvez configurer un disque ou un équivalent pour limiter le taux de fantaisie, mais je soupçonne que, dans votre cas, cela serait excessif. La documentation à ce sujet est disponible sur le HOWTO Linux Advanced Routing and Traffic Control

Devdas
la source