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.)
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
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
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.
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.
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.
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