Wie kann ich die von einem Prozess genutzte Bandbreite begrenzen?

Wie kann ich die von einem Prozess genutzte Bandbreite begrenzen?

Ich habe einen CentOS 5.7-Server, der jede Nacht seine Dateien sichert. Ich bin besorgt, dass Besucher der verschiedenen Websites, die der Server hostet, eine Leistungseinbuße erleben werden, 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 den SSH-basierten Dateitransfer auf nur die Hälfte meiner verfügbaren Bandbreite beschränken. Dies könnte 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 hinzufügen, die nur für Sicherungen vorgesehen ist. Ich könnte meinen verfügbaren Durchsatz erhöhen, aber das würde lediglich bedeuten, dass die Netzwerkübertragung schneller abgeschlossen wäre, dabei aber trotzdem die Gesamtkapazität der Verbindung maximiert würde.)


Hintergrund

Vielleicht sind ein paar Hintergrundinformationen angebracht. Zurückblickend hatte ich das Problem, dass ich nicht genügend lokalen Speicherplatz hatte, um das Backup selbst zu erstellen. Hier kommt SSHFS ins Spiel! Das Backup wird auf einem vermeintlich lokalen Laufwerk gespeichert, sodass sich keine Backup-Bits auf dem Webserver selbst befinden.

Warum ist das wichtig? Weil das die Verwendung des ehrwürdigen ungültig machen würde rsync --bwlimit. rsyncführt weder die Übertragung durch, nochdürfenweil ich nicht einmal genügend Speicherplatz habe, um die Sicherungsdatei zu speichern.

Ich kann Sie schon fragen hören: „Moment mal, warum müssen Sie überhaupt eine Sicherungsdatei erstellen? Warum nicht einfach rsyncdie Quelldateien und -ordner?“ Weil ein lästiges Ding namens „Plesk“ im Spiel ist! Dies ist mein kundenorientierter Webhost, der Plesk aus praktischen Gründen verwendet. Daher verwende ich Plesk, um die Sicherungen zu initiieren, da Plesk dem Backup jede Menge zusätzliche Magie hinzufügt, die die Verwendung während eines Wiederherstellungsvorgangs sehr sicher macht.

trauriges Gesicht

Antwort1

Eine Option, die ich gerade entdeckt habe, ist die Verwendungtrickle.

trickleist ein portabler, leichtgewichtiger Bandbreiten-Shaper für den Benutzerbereich. Er kann im kollaborativen Modus (zusammen mit trickled) oder im Standalone-Modus ausgeführt werden.

tricklefunktioniert, indem es das Vorladen des Unix-Loaders nutzt. Im Wesentlichen stellt es der Anwendung eine neue Version der Funktionalität zur Verfügung, die zum Senden und Empfangen von Daten über Sockets erforderlich ist. Anschließend begrenzt es den Datenverkehr, indem es das Senden und Empfangen von Daten über einen Socket verzögert. trickleläuft vollständig im Benutzerbereich und erfordert keine Root-Berechtigungen.

Für Ubuntu-Benutzer installieren Sie es durch Ausführen

sudo apt install trickle

Führen Sie es beispielsweise aus maven buildund begrenzen Sie die Downloadrate auf 20 kB/s und die Uploadrate auf 111 kB/s:

trickle -sd 20 -u 111 mvn build

Antwort2

Sie können iptablesdamit ein Paket markieren (--pid-owner ...) und dann tcden Datenverkehr strukturieren. Außerdem können Sie mit „--sid-owner“ Threads und untergeordnete Prozesse dieses Prozesses einschließen.

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

Übereinstimmen --pid-Besitzer
Kernel2.3, 2.4, 2.5 und 2.6
Beispiel iptables -A AUSGABE -m Besitzer --pid-Besitzer 78
Erläuterung Diese Übereinstimmung wird verwendet, um Pakete basierend auf der Prozess-ID (PID) abzugleichen, die für sie verantwortlich war. Diese Übereinstimmung ist etwas schwieriger zu verwenden, aber ein Beispiel wäre, nur PID 94 das Senden von Paketen vom HTTP-Port zu erlauben (natürlich nur, wenn der HTTP-Prozess nicht threaded ist). Alternativ könnten wir ein kleines Skript schreiben, das die PID aus einer PS-Ausgabe für einen bestimmten Daemon abruft und dann eine Regel dafür hinzufügt. Beispielsweise könnten Sie eine Regel wie im Beispiel Pid-owner.txt haben

Antwort3

Wenn Sie in eine Pipe (oder stdout) schreiben können, können Sie den pvBefehl (Pipe Viewer) installieren. Er wurde ursprünglich geschrieben, um den Fortschritt der durch 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.

Antwort4

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

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

Alternativ könnten Sie eine QDisc oder ein ähnliches Programm einrichten, um eine ausgefallene Ratenbegrenzung durchzuführen, aber ich vermute, dass dies in Ihrem Fall ein deutlicher Overkill wäre. Dokumentation hierzu finden Sie unterDas Linux-Howto für erweitertes Routing und Verkehrssteuerung

verwandte Informationen