web-dev-qa-db-fra.com

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

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 voient leurs performances se dégrader pendant le transfert de la sauvegarde sur le réseau.

Est-il possible de limiter le débit maximal autorisé d'un processus à une interface réseau? Je voudrais limiter le transfert de fichiers basé sur SSH à seulement 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 d'interface à dédier aux sauvegardes. Je pourrais augmenter mon débit disponible, mais cela signifierait simplement que le transfert réseau se terminerait plus rapidement, mais toujours au maximum la capacité totale de la connexion en le faisant.)


Quelques antécédents

Peut-être que certains antécédents s'imposent. En prenant du recul, j'ai eu un problème avec le manque d'espace local pour créer la sauvegarde elle-même. Entrez SSHFS! La sauvegarde est enregistrée sur ce qui est apparemment un lecteur local afin 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. rsync ne fait pas réellement le transfert ni peut parce que je ne peux même pas ménager de l'espace pour enregistrer le fichier de sauvegarde.

Je vous entends demander: "Alors attendez, pourquoi avez-vous même besoin de créer un fichier de sauvegarde? Pourquoi pas simplement rsync les fichiers et dossiers source?" Parce qu'une chose ennuyeuse appelée "Plesk" est dans le mélange! Il s'agit de mon hébergeur Web client 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 rend sa consommation pendant une procédure de restauration très sûre.

visage triste

44
Wesley

Vous pouvez utiliser iptables pour marquer un paquet (--pid-owner ...), puis utiliser tc pour façonner le trafic. "--Sid-owner" peut également être utilisé pour inclure les threads et les enfants de ce processus.

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

Correspondance --pid-owner
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m owner --pid-owner 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 serait uniquement de permettre au PID 94 d'envoyer des paquets depuis le port HTTP (si le processus HTTP n'est pas enfilé, bien sûr). Alternativement, nous pourrions écrire un petit script qui récupère le PID à partir d'une sortie ps pour un démon spécifique, puis ajoute une règle pour celui-ci. Pour un exemple, vous pouvez avoir une règle comme indiqué dans l'exemple Pid-owner.txt

26
Mircea Vutcovici

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

le filet est un modeleur de bande passante léger et portable. Il peut fonctionner en mode collaboratif (avec ruissellement) ou en mode autonome.

le filet fonctionne en profitant 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. le filet s'exécute entièrement dans l'espace utilisateur et ne nécessite pas de privilèges root.

41
Wesley

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

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.
22
hhaamu

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

Notre Ethernet 1 Gbit est facilement capable de submerger notre ancien RAID DSI SCSI320, et essentiellement certains de nos anciens boîtiers de production qui en dépendent pour ses magasins NFS.

7
Magellan

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 qdisc ou équivalent pour limiter le taux de fantaisie, mais je soupçonne que dans votre cas, ce serait une exagération grave. La documentation à ce sujet est disponible sur HOWTO Linux Advanced Routing and Traffic Control

4
Devdas