Wie kann ich die von einem Prozess verwendete Bandbreite begrenzen?

42

Ich habe einen CentOS 5.7-Server, dessen Dateien jede Nacht gesichert werden. Ich mache mir Sorgen, dass die Leistung der Besucher der verschiedenen Sites, die auf dem Server gehostet werden, abnimmt, während das Backup über das Netzwerk übertragen wird.

Ist es möglich, den maximal zulässigen Durchsatz eines Prozesses auf eine Netzwerkschnittstelle zu beschränken? Ich möchte die SSH-basierte Dateiübertragung auf die Hälfte meiner verfügbaren Bandbreite beschränken. Dies kann auf der Server- oder Clientseite erfolgen. Das heißt, ich würde dies gerne entweder auf dem Client tun, der die Verbindung initiiert, oder auf dem Server, der die Verbindung empfängt.

(Leider kann ich keine Schnittstelle für Backups hinzufügen. Ich könnte meinen verfügbaren Durchsatz erhöhen, aber das würde lediglich bedeuten, dass die Netzwerkübertragung schneller abgeschlossen wird, aber die Gesamtkapazität der Verbindung dabei immer noch maximal ist.)


Einige Hintergrundinformationen

Vielleicht ist etwas Hintergrundwissen angebracht. Als ich zurücktrat, hatte ich ein Problem, weil ich nicht genug lokalen Speicherplatz hatte, um das Backup selbst zu erstellen. Geben Sie SSHFS ein! Die Sicherung wird auf einem angeblich lokalen Laufwerk gespeichert, sodass sich keine Sicherungsbits auf dem Webserver befinden.

Warum ist das so wichtig? Denn das scheint den Gebrauch des Ehrwürdigen zunichte zu machen rsync --bwlimit. rsyncführt die Übertragung nicht durch und kann es auch nicht, weil ich nicht einmal den Speicherplatz für die Sicherungsdatei frei habe.

Ich kann Sie fragen hören: "Warten Sie, warum müssen Sie überhaupt eine Sicherungsdatei erstellen? Warum nicht nur rsyncdie Quelldateien und -ordner?" Denn eine nervige Sache namens "Plesk" ist in der Mischung! Dies ist mein Client-konformer Webhost, der Plesk zur Vereinfachung verwendet. Daher verwende ich Plesk, um die Sicherungen zu initiieren, da Plesk dem Backup jede Menge zusätzliche Magie hinzufügt, die es während eines Wiederherstellungsvorgangs sehr sicher macht.

trauriges Gesicht

Wesley
quelle
1
Eine andere Möglichkeit für meine Situation, die im Übrigen die spezifische Frage nicht genau beantwortet, besteht darin ionice, die Schreibvorgänge zu drosseln, die ein Prozess ausführen kann. Da ich in ein SSHFS-Dateisystem schreibe, kann ich die Klasse des Sicherungsprozesses auf 3 setzen, damit er allen anderen Prozessen, die schreiben möchten, vollständig nachgibt. Auf diese Weise erhalte ich den gewünschten Effekt, der die Erfahrung eines Website-Besuchers aufgrund der Backup-Hogging-Bandbreite nicht beeinträchtigt.
Wesley
Eine Frage, Ihre ssh verwendet Komprimierung? "Komprimierung ja" zu Ihrer .ssh / config?
Zlatko

Antworten:

25

Mit können Sie iptablesein Paket markieren (--pid-owner ...) und dann tcden Datenverkehr formen. "--Sid-owner" kann auch verwendet werden, um Threads und untergeordnete Elemente dieses Prozesses einzuschließen.

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

Spiel --pid-Besitzer
Kernel 2.3, 2.4, 2.5 und 2.6
Beispiel iptables -A OUTPUT -m Besitzer --pid-Inhaber 78
Erläuterung Dieses Spiel verwendet wird , Pakete auf der Prozess - ID (PID) auf der Basis übereinstimmen , die für sie verantwortlich war. Diese Übereinstimmung ist etwas schwieriger zu verwenden, aber ein Beispiel wäre, PID 94 nur zu erlauben, Pakete vom HTTP-Port zu senden (wenn der HTTP-Prozess natürlich kein Thread ist). Alternativ könnten wir ein kleines Skript schreiben, das die PID aus einer ps-Ausgabe für einen bestimmten Dämon abruft und dann eine Regel dafür hinzufügt. Als Beispiel könnten Sie eine Regel haben, wie im Beispiel Pid-owner.txt gezeigt

Mircea Vutcovici
quelle
Ich denke, das hängt mit meiner Lösung zusammen, um dies am besten zu erreichen. --pid-owner wählt nicht basierend auf dem Prozess aus, sondern basierend auf dem Prozesseigner. Ich müsste einen speziellen Benutzer erstellen, um den Prozess als zu starten und dann basierend auf diesem Eigentümer zu filtern, damit ich sicher sein kann, dass ich den Verkehr nur von diesem bestimmten Prozess aus gestalte und nicht von mehreren Dämonen, von denen aus möglicherweise gestartet wurde ein generischer Benutzer.
Wesley
@Wesley Das steht nicht in der Manpage: "Stimmt überein, --pid-owner processidob das Paket von einem Prozess mit der angegebenen Prozess-ID erstellt wurde ." linux.die.net/man/8/iptables
Ajedi32
Diese Antwort wäre viel besser, wenn sie ein Beispiel für die Verwendung von iptables und tc für diesen Zweck enthalten würde. Das angegebene iptables -A OUTPUT -m owner --pid-owner 78Beispiel scheint nicht vollständig zu sein (da es nur mit Paketen übereinstimmt, nicht sagt, wie sie "markiert" werden sollen) und tcwird überhaupt nicht erklärt.
Ajedi32
Um ein Paket zu markieren, müssen Sie etwas hinzufügen -j MARK --set-mark 1. Weitere Informationen finden Sie unter: wiki.archlinux.org/index.php/…
Mircea Vutcovici
40

Eine Option, die ich gerade entdeckt habe, ist die Verwendung von Rinnsal .

trickle ist ein portabler, leichter Bandbreiten-Shaper für Benutzer. Es kann im kollaborativen Modus (zusammen mit Trickled) oder im Standalone-Modus ausgeführt werden.

Erhaltungsarbeiten durch Ausnutzen des Unix-Loader-Preloading. Im Wesentlichen bietet es der Anwendung eine neue Version der Funktionalität, die zum Senden und Empfangen von Daten über Sockets erforderlich ist. Anschließend wird der Datenverkehr begrenzt, indem das Senden und Empfangen von Daten über einen Socket verzögert wird. trickle läuft vollständig im Userspace und benötigt keine root-Rechte.

Wesley
quelle
1
Dies ist derjenige, der mein Problem gelöst hat. Ich hatte ein Problem mit dem Bitcoin-Daemon, der meine gesamte Bandbreite zufällig gelutscht hat, als ein Client entschied, dass ich die Person war, von der er die gesamte Blockchain herunterladen sollte.
Omnifarious
Der von trickleIhnen angegebene Link führt zu einer 404.
Geremia
Ich habe den defekten Link behoben (indem ich ihn durch einen Wayback Machine-Link ersetzte).
G-Man sagt, dass Monica
3
Trickle scheint jetzt auf github zu sein: github.com/mariusae/trickle
Cheetah
odersudo apt-get install trickle
ggll
22

Wenn Sie in eine Pipe (oder stdout) schreiben können, können Sie den pvBefehl (pipe viewer) installieren . Es wurde ursprünglich geschrieben, um den Fortschritt der über eine Pipe übertragenen Daten anzuzeigen.

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
quelle
Dies ist eigentlich die Antwort, die ich verwenden werde! Es ist jedoch nicht genau eine Antwort auf die spezifische Frage, die ich ursprünglich gestellt habe. Leider hat sich die Frage verwandelt, konzentrierte sich aber immer noch darauf, die Netzwerkgeschwindigkeit eines Prozesses zu begrenzen. Sie können jedoch zu dieser neuen Frage beitragen, die ich gestellt habe: unix.stackexchange.com/q/34174/4232
Wesley
Vielen Dank! Ich habe etwas Ähnliches gemacht und es dann auch getan ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz.
Klackern Sie
1
Hätte es auch mit ionice kombinieren können, aber es war auf diesem bestimmten Server nicht erlaubt. ssh my-remote-server ionice -c3 bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz
Klackern Sie
6

Aus dem gleichen Grund verwende ich rsync mit der Option --bwlimit = KBPS.

Unser 1-Gbit-Ethernet ist problemlos in der Lage, unser altes SCSI320-DAS-RAID zu überfluten, und im Grunde genommen sind es einige unserer älteren DOS-Produktionsboxen, die es für ihre NFS-Stores verwenden.

Magellan
quelle
4

Wie übertragen Sie die Daten? (rsync über ssh? scp? sftp? noch etwas?)

Mit rsync können Sie die Bandbreite begrenzen (siehe die Option --bwlimit = KBPS). rsync -e ssh --bwlimit ..

Alternativ könnten Sie eine qdisc oder ein Äquivalent einrichten, um die Phantasierate zu begrenzen, aber ich vermute, dass dies in Ihrem Fall ein schwerwiegender Overkill wäre. Die Dokumentation hierzu finden Sie im Linux Advanced Routing and Traffic Control HOWTO

Devdas
quelle