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

J'ai un server CentOS 5.7 qui va sauvegarder ses files tous les soirs. Je suis préoccupé par le fait que les visiteurs des différents sites hébergeant le server subiront des performances dégradées pendant le transfert de la sauvegarde sur le réseau.

Est-il possible de limiter le débit maximal autorisé d'un process à une interface réseau? Je voudrais limiter le transfert de files SSH à seulement la moitié de ma bande passante disponible. Cela pourrait être du côté du server ou du client; c'est-à-dire, je serais heureux de le faire sur le client qui initie la connection ou le server qui reçoit la connection.

(Malheureusement, je ne peux pas append d'interface à dédier aux sauvegardes, mais cela augmenterait le débit disponible, mais cela signifierait simplement que le transfert du réseau se ferait plus rapidement, tout en conservant la capacité totale de la connection).


Quelques antécédents

Peut-être un peu de fond est en ordre. En reculant, j'ai eu un problème de 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 server Web lui-même.

Pourquoi est-ce important? Parce que cela semble invalider l'utilisation du vénérable rsync --bwlimit . rsync ne fait pas réellement le transfert ni le peut parce que je ne peux même pas épargner l'espace pour save le dossier de secours.

Je peux vous entendre requestr: "Alors attendez, pourquoi avez-vous même besoin de faire un file de sauvegarde? Pourquoi ne pas simplement rsync les files source et les dossiers?" Parce qu'une chose ennuyeuse appelée "Plesk" est dans le mélange! C'est mon hébergeur 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 magies supplémentaires à la sauvegarde, ce qui rend sa consommation pendant une procédure de restauration très sûre.

visage sortingste

Vous pouvez utiliser iptables pour marquer un package (–pid-owner …), puis utiliser tc pour configurer le trafic. Aussi "–sid-owner" peut être utilisé pour inclure les threads et les enfants de ce process.

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

Match –pid-propriétaire
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 packages en fonction de l'identificateur de process (PID) qui en était responsable. Cette correspondance est un peu plus difficile à utiliser, mais un exemple serait de permettre au PID 94 d'envoyer des packages à partir du port HTTP (si le process HTTP n'est pas threadé, bien sûr). Sinon, nous pourrions écrire un petit script qui attrape le PID à partir d'une sortie ps pour un démon spécifique, puis ajoute une règle pour cela. Par exemple, vous pourriez avoir une règle comme indiqué dans l'exemple Pid-owner.txt

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

filet est un shaper portatif léger de bande passante d'espace user. Il peut fonctionner en mode collaboratif (avec ruissellement) ou en mode autonome.

filet fonctionne en tirant parti de la préchargement du chargeur unix. Essentiellement, il fournit à l'application une nouvelle version de la fonctionnalité requirejse 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 une socket. le filet s'exécute entièrement dans l'espace user et ne nécessite pas de privilèges root.

Si vous pouvez écrire dans un pipe (ou stdout), vous pouvez installer la command pv (pipe viewer). Il a été écrit à l'origine pour afficher la progression des données transférées à travers un tuyau.

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. 

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

Notre ethernet 1 Gbit est facilement capable de submerger notre ancien SCSI320 DAS RAID, et essentiellement DOS certains de nos boites de production plus anciennes qui countnt sur elle pour ses magasins NFS.

Comment transférez-vous datatables? (rsync sur ssh? scp? sftp? quelque chose d'autre?)

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

Sinon, vous pouvez configurer un qdisc ou l'équivalent pour limiter le taux de fantaisie, mais je soupçonne que dans votre cas ce serait sévère overkill. Une documentation à ce sujet est disponible sur le HOWTO Linux Advanced Routing and Traffic Control