Trickle - Begrenzen Sie die Netzwerkbandbreite von Anwendungen in einem Linux
Sind Sie schon einmal auf Situationen gestoßen, in denen eine Anwendung Ihre Netzwerkbandbreite dominiert hat? Wenn Sie jemals in einer Situation waren, in der eine Anwendung Ihren gesamten Datenverkehr verschlingt, dann werden Sie die Rolle der Trickle-Bandwidth-Shaper-Anwendung zu schätzen wissen.
Unabhängig davon, ob Sie ein Systemadministrator oder nur ein Linux-Benutzer sind, müssen Sie lernen, wie Sie die Upload- und Download-Geschwindigkeiten für Anwendungen steuern können, um sicherzustellen, dass Ihre Netzwerkbandbreite nicht von einer einzelnen Anwendung verbrannt wird.
Was ist Trickle?
Trickle ist ein Tool zur Gestaltung der Netzwerkbandbreite, mit dem wir die Upload- und Download-Geschwindigkeiten von Anwendungen verwalten können, um zu verhindern, dass eine einzelne von ihnen die gesamte (oder den größten) Teil der verfügbaren Bandbreite in Beschlag nimmt.
Kurz gesagt, mit Trickle können Sie die Netzwerkdatenverkehrsrate pro Anwendung steuern, im Gegensatz zur Steuerung pro Benutzer, die das klassische Beispiel für die Bandbreitengestaltung in einer Client-Server-Umgebung ist und wahrscheinlich das Setup ist, mit dem wir besser vertraut sind.
Wie funktioniert Trickle?
Darüber hinaus kann uns ein Rinnsal dabei helfen, Prioritäten pro Anwendung zu definieren, so dass Prioritäts-Apps auch dann automatisch mehr Bandbreite erhalten, wenn Gesamtgrenzwerte für das gesamte System festgelegt wurden.
Um diese Aufgabe zu erfüllen, legt das Trickle Datenverkehrsgrenzwerte für die Art und Weise fest, wie Daten über TCP-Verbindungen an Sockets gesendet und von diesen empfangen werden. Wir müssen beachten, dass das Trickle, abgesehen von den Datenübertragungsraten, das Verhalten des Prozesses, den es zu einem bestimmten Zeitpunkt formt, in keiner Weise verändert.
Was kann Trickle nicht?
Die einzige Einschränkung besteht sozusagen darin, dass Trickle nicht mit statisch verknüpften Anwendungen oder Binärdateien mit den SUID- oder SGID-Bits funktioniert, da es dynamisches Verknüpfen und Laden verwendet, um sich zwischen dem geformten Prozess und der zugehörigen Netzwerkdose zu platzieren. Trickle fungiert dann als Proxy zwischen diesen beiden Softwarekomponenten.
Da Trickle keine Superuser-Rechte benötigt, um ausgeführt zu werden, können Benutzer ihre eigenen Datenverkehrslimits festlegen. Da dies möglicherweise nicht wünschenswert ist, werden wir untersuchen, wie Gesamtgrenzwerte festgelegt werden können, die Systembenutzer nicht überschreiten dürfen. Mit anderen Worten, die Benutzer werden weiterhin in der Lage sein, ihre Datenverkehrsraten zu verwalten, aber immer innerhalb der vom Systemadministrator festgelegten Grenzen.
Testumgebung
In diesem Artikel erklären wir, wie Sie die von Anwendungen auf einem Linux-Server verwendete Netzwerkbandbreite mit einem Rinnsal begrenzen können.
Um den notwendigen Datenverkehr zu generieren, verwenden wir ncftpput und ncftpget (beide Tools sind durch die Installation von ncftp verfügbar) auf dem Client (CentOS-Server – dev1: 192.168.0.17) und vsftpd auf dem Server (Debian – dev2: 192.168.0.15) zu Demonstrationszwecken.
Die gleichen Anweisungen funktionieren auch auf RHEL-basierten und Debian-basierten Distributionen wie Ubuntu und Linux Mint.
So installieren Sie ncftp und vsftpd unter Linux
1. Für RedHat-basierte Distributionen müssen Sie das EPEL-Repository aktivieren, ein Repository mit hochwertiger freier und Open-Source-Software, die vom Fedora-Projekt gepflegt wird.
Installieren Sie EPEL auf RHEL 9:
sudo subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
Installieren Sie EPEL auf CentOS 9, AlmaLinux 9, Rocky Linux 9:
sudo dnf config-manager --set-enabled crb
sudo dnf install epel-release
Installieren Sie EPEL auf RHEL 8:
sudo subscription-manager repos --enable codeready-builder-for-rhel-8-$(arch)-rpms
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
Installieren Sie EPEL auf CentOS 8, AlmaLinux 8, Rocky Linux 8:
sudo dnf config-manager --set-enabled powertools
sudo dnf install epel-release
2. Installieren Sie als Nächstes ncftp wie folgt.
sudo dnf install ncftp [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo apt install ncftp [On Debian, Ubuntu and Mint]
3. Richten Sie einen FTP-Server auf einem separaten Server ein. Bitte beachten Sie, dass FTP zwar von Natur aus unsicher ist, aber immer noch häufig in Fällen verwendet wird, in denen keine Sicherheit beim Hoch- oder Herunterladen von Dateien erforderlich ist.
Wir verwenden es in diesem Artikel, um die Bounties von Trickle zu veranschaulichen und weil es die Übertragungsraten in stdout auf dem Client anzeigt, und wir werden die Diskussion darüber verlassen, ob es für ein anderes Datum und eine andere Uhrzeit verwendet werden sollte oder nicht.
sudo dnf install vsftpd [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo apt install vsftpd [On Debian, Ubuntu and Mint]
Bearbeiten Sie nun die Datei /etc/vsftpd/vsftpd.conf auf dem FTP-Server wie folgt:
$ sudo nano /etc/vsftpd/vsftpd.conf
OR
sudo nano /etc/vsftpd.conf
Nehmen Sie die folgenden Änderungen vor:
anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
Stellen Sie danach sicher, dass Sie vsftpd für Ihre aktuelle Sitzung starten und für den automatischen Start bei zukünftigen Starts aktivieren:
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
sudo systemctl status vsftpd
4. Wenn Sie sich dafür entscheiden, den FTP-Server in einem CentOS/RHEL-Droplet mit SSH-Schlüsseln für den Fernzugriff einzurichten, benötigen Sie ein passwortgeschütztes Benutzerkonto mit den entsprechenden Verzeichnis- und Dateiberechtigungen für den Hoch- und Download der gewünschten Inhalte AUSSERHALB des Home-Verzeichnisses von root.
Sie können dann zu Ihrem Home-Verzeichnis navigieren, indem Sie die folgende URL in Ihren Browser eingeben. Es öffnet sich ein Anmeldefenster, in dem Sie aufgefordert werden, ein gültiges Benutzerkonto und Passwort auf dem FTP-Server einzugeben.
ftp://192.168.0.15
Wenn die Authentifizierung erfolgreich ist, sehen Sie den Inhalt Ihres Home-Verzeichnisses. Später in diesem Tutorial können Sie diese Seite aktualisieren, um die Dateien anzuzeigen, die in den vorherigen Schritten hochgeladen wurden.
So installieren Sie Trickle unter Linux
Installieren Sie nun Trickle über yum oder apt.
Um eine erfolgreiche Installation zu gewährleisten, wird es als bewährte Methode angesehen, sicherzustellen, dass die aktuell installierten Pakete auf dem neuesten Stand sind (mit yum update), bevor Sie das Tool selbst installieren.
sudo yum -y update && sudo yum install trickle [On RedHat based systems]
sudo apt -y update && sudo apt install trickle [On Debian based systems]
Überprüfen Sie, ob das Trickle mit der gewünschten Binärdatei funktioniert. Wie wir bereits erläutert haben, funktioniert das Trickle nur mit Binärdateien, die dynamische oder gemeinsam genutzte Bibliotheken verwenden.
Um zu überprüfen, ob wir dieses Tool mit einer bestimmten Anwendung verwenden können, können wir das bekannte Dienstprogramm ldd verwenden, wobei ldd für list dynamic dependencies steht.
Insbesondere werden wir nach dem Vorhandensein von glibc (der GNU C-Bibliothek) in der Liste der dynamischen Abhängigkeiten eines bestimmten Programms suchen, da es genau diese Bibliothek ist, die die Systemaufrufe definiert, die an der Kommunikation über Sockets beteiligt sind.
Führen Sie den folgenden Befehl für eine bestimmte Binärdatei aus, um zu sehen, ob Trickle verwendet werden kann, um die Bandbreite zu formen:
sudo ldd $(which [binary]) | grep libc.so
Zum Beispiel
sudo ldd $(which ncftp) | grep libc.so
deren Ausgabe ist:
sudo libc.so.6 => /lib64/libc.so.6 (0x00007efff2e6c000)
Die Zeichenkette in eckigen Klammern in der Ausgabe kann sich von System zu System und sogar zwischen nachfolgenden Ausführungen desselben Befehls ändern, da sie die Ladeadresse der Bibliothek im physischen Speicher darstellt.
Wenn der obige Befehl keine Ergebnisse zurückgibt, bedeutet dies, dass die Binärdatei, für die er ausgeführt wurde, libc nicht verwendet und daher Trickle in diesem Fall nicht als Bandbreitenformer verwendet werden kann.
Erfahren Sie, wie Sie Trickle unter Linux verwenden
Die grundlegendste Verwendung von Trickle ist der Standalone-Modus. Bei diesem Ansatz wird das Trickle verwendet, um die Download- und Upload-Geschwindigkeiten einer bestimmten Anwendung explizit zu definieren. Wie wir bereits erklärt haben, werden wir der Kürze halber dieselbe Anwendung für Download- und Upload-Tests verwenden.
Ausführen von Trickle im Standalone-Modus
Wir vergleichen die Download- und Upload-Geschwindigkeiten mit und ohne Verwendung von Trickle. Die Option -d gibt die Download-Geschwindigkeit in KB/s an, während das Flag -u Trickle anweist, die Upload-Geschwindigkeit um die gleiche Einheit zu begrenzen. Darüber hinaus verwenden wir das Flag -s, das angibt, dass Trickle im Standalone-Modus ausgeführt werden soll.
Die grundlegende Syntax zum Ausführen von Trickle im eigenständigen Modus lautet wie folgt:
sudo trickle -s -d [download rate in KB/s] -u [upload rate in KB/s]
Um die folgenden Beispiele selbst ausführen zu können, stellen Sie sicher, dass trickle und ncftp auf dem Clientcomputer installiert sind (in meinem Fall 192.168.0.17).
Beispiel 1: Hochladen einer 2,8 MB großen Datei mit und ohne Trickle
Wir verwenden die frei verteilbare Linux Fundamentals PDF-Datei (hier erhältlich) für die folgenden Tests.
Sie können diese Datei zunächst mit dem folgenden wget-Befehl in Ihr aktuelles Arbeitsverzeichnis herunterladen:
wget http://linux-training.be/files/books/LinuxFun.pdf
Die Syntax zum Hochladen einer Datei auf unseren FTP-Server ohne Trickle lautet wie folgt:
sudo ncftpput -u username -p password 192.168.0.15 /remote_directory local-filename
Dabei ist /remote_directory der Pfad des Upload-Verzeichnisses relativ zur Startseite des Benutzernamens, und local-filename ist eine Datei in Ihrem aktuellen Arbeitsverzeichnis.
Konkret erhalten wir ohne Trickle eine maximale Upload-Geschwindigkeit von 52,02 MB/s (bitte beachten Sie, dass dies nicht die tatsächliche durchschnittliche Upload-Geschwindigkeit ist, sondern eine sofortige Startspitze), und die Datei wird fast sofort hochgeladen:
sudo ncftpput -u username -p password 192.168.0.15 /testdir LinuxFun.pdf
Ausgabe:
LinuxFun.pdf: 2.79 MB 52.02 MB/s
Mit Trickle begrenzen wir die Upload-Übertragungsrate auf 5 KB/s. Bevor wir die Datei zum zweiten Mal hochladen, müssen wir sie aus dem Zielverzeichnis löschen.
Andernfalls informiert uns ncftp darüber, dass die Datei im Zielverzeichnis dieselbe ist, die wir hochladen möchten, und führt die Übertragung nicht durch:
rm /absolute/path/to/destination/directory/LinuxFun.pdf
Dann:
trickle -s -u 5 ncftpput -u username -p password 111.111.111.111 /testdir LinuxFun.pdf
Ausgabe:
LinuxFun.pdf: 2.79 MB 4.94 kB/s
Im obigen Beispiel können wir sehen, dass die durchschnittliche Upload-Geschwindigkeit auf ~5 KB/s gesunken ist.
Beispiel 2: Herunterladen derselben 2,8-MB-Datei mit und ohne Trickle
Denken Sie zunächst daran, die PDF-Datei aus dem ursprünglichen Quellverzeichnis zu löschen:
rm /absolute/path/to/source/directory/LinuxFun.pdf
Bitte beachten Sie, dass in den folgenden Fällen die Remote-Datei in das aktuelle Verzeichnis auf dem Client-Rechner heruntergeladen wird. Diese Tatsache wird durch den Punkt ('.'), die nach der IP-Adresse des FTP-Servers angezeigt wird.
Ohne Rinnsal:
ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf
Ausgabe:
LinuxFun.pdf: 2.79 MB 260.53 MB/s
Mit Trickle, Begrenzung der Download-Geschwindigkeit auf 20 KB/s:
trickle -s -d 30 ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf
Ausgabe:
LinuxFun.pdf: 2.79 MB 17.76 kB/s
Ausführen von Trickle im überwachten [nicht verwalteten] Modus
Trickle kann auch im nicht verwalteten Modus ausgeführt werden, indem eine Reihe von Parametern in /etc/trickled.conf definiert wird. Diese Datei definiert, wie sich trickled (der Daemon) verhält und wie trickle verwaltet wird.
Wenn wir globale Einstellungen festlegen möchten, die insgesamt von allen Anwendungen verwendet werden sollen, müssen wir außerdem den Befehl trickled verwenden. Dieser Befehl führt den Daemon aus und ermöglicht es uns, Download- und Upload-Limits zu definieren, die von allen Anwendungen, die über Trickle ausgeführt werden, gemeinsam genutzt werden, ohne dass wir jedes Mal Limits angeben müssen.
Führen Sie beispielsweise Folgendes aus:
trickled -d 50 -u 10
Dies führt dazu, dass die Download- und Upload-Geschwindigkeiten jeder Anwendung, die durch Trickle ausgeführt wird, auf 30 KB/s bzw. 10 KB/s begrenzt werden.
Bitte beachten Sie, dass Sie jederzeit überprüfen können, ob trickled läuft und mit welchen Argumenten:
ps -ef | grep trickled | grep -v grep
Ausgabe:
root 16475 1 0 Dec24 ? 00:00:04 trickled -d 50 -u 10
Beispiel 3: Hochladen einer 19 MB großen MP4-Datei auf einen FTP-Server mit Trickle
In diesem Beispiel verwenden wir das frei verteilbare Video "Er ist das Geschenk", das unter diesem Link zum Download zur Verfügung steht.
Wir laden diese Datei zunächst mit dem folgenden Befehl in Ihr aktuelles Arbeitsverzeichnis herunter:
wget http://media2.ldscdn.org/assets/missionary/our-people-2014/2014-00-1460-he-is-the-gift-360p-eng.mp4
Zunächst starten wir den Trickled-Daemon mit dem oben aufgeführten Befehl:
trickled -d 30 -u 10
Ohne Rinnsal:
ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4
Ausgabe:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 36.31 MB/s
Mit Tröpfchen:
trickle ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4
Ausgabe:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 9.51 kB/s
Wie wir in der obigen Ausgabe sehen können, ist die Upload-Übertragungsrate auf ~10 KB/s gesunken.
Beispiel 4: Herunterladen desselben Videos mit Trickle
Wie in Beispiel 2 laden wir die Datei in das aktuelle Arbeitsverzeichnis herunter.
Ohne Rinnsal:
ncftpget -u username -p password 192.168.0.15 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4
Ausgabe:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 108.34 MB/s
Mit Tröpfchen:
trickle ncftpget -u username -p password 111.111.111.111 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4
Ausgabe:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 29.28 kB/s
Dies entspricht dem zuvor festgelegten Download-Limit (30 KB/s).
Hinweis: Sobald der Daemon gestartet wurde, besteht keine Notwendigkeit, individuelle Limits für jede Anwendung festzulegen, die Trickle verwendet.
Wie wir bereits erwähnt haben, kann man die Bandbreitengestaltung von Trickle über trickled.conf weiter anpassen. Ein typischer Abschnitt in dieser Datei besteht aus den folgenden Abschnitten:
[service]
Priority = <value>
Time-Smoothing = <value>
Length-Smoothing = <value>
Wo
- [service] gibt den Namen der Anwendung an, deren Bandbreitennutzung wir beeinflussen möchten.
- Die Priorität ermöglicht es uns, einen Dienst so zu spezifizieren, dass er relativ zu einem anderen eine höhere Priorität hat, so dass eine einzelne Anwendung nicht die gesamte Bandbreite beanspruchen kann, die der Daemon verwaltet. Je niedriger die Zahl, desto mehr Bandbreite wird [service] zugewiesen.
- Time-Smoothing [in Sekunden]: Definiert, in welchen Zeitintervallen die Anwendung Daten übertragen und/oder empfangen soll. Kleinere Werte (etwa im Bereich von 0,1 bis 1 s) sind ideal für interaktive Anwendungen und führen zu einer kontinuierlicheren (flüssigeren) Sitzung, während etwas größere Werte (1 – 10 s) besser für Anwendungen geeignet sind, die eine Massenübertragung erfordern. Wenn kein Wert angegeben ist, wird der Standardwert (5 s) verwendet.
- Längenglättung [in KB]: Die Idee ist die gleiche wie bei der Zeitglättung, basiert jedoch auf der Länge eines E/A-Vorgangs. Wenn kein Wert angegeben wird, wird der Standardwert (10 KB) verwendet.
Wenn Sie die Glättungswerte ändern, wird die von [service] angegebene Anwendung mit Übertragungsraten innerhalb eines Intervalls anstelle eines festen Werts übersetzt. Leider gibt es keine Formel, um die unteren und oberen Grenzen dieses Intervalls zu berechnen, da es hauptsächlich vom jeweiligen Fallszenario abhängt.
Im Folgenden finden Sie eine Beispieldatei für trickled.conf im CentOS 7-Client (192.168.0.17):
[ssh]
Priority = 1
Time-Smoothing = 0.1
Length-Smoothing = 2
[ftp]
Priority = 2
Time-Smoothing = 1
Length-Smoothing = 3
Mit diesem Setup priorisiert trickled SSH-Verbindungen gegenüber FTP-Übertragungen. Beachten Sie, dass ein interaktiver Prozess, z. B. SSH, kleinere Zeitglättungswerte verwendet, während ein Dienst, der Massendatenübertragungen (FTP) durchführt, einen höheren Wert verwendet.
Die Glättungswerte sind dafür verantwortlich, dass die Download- und Upload-Geschwindigkeiten in unserem vorherigen Beispiel nicht mit dem genauen Wert übereinstimmen, der vom durchgesickerten Daemon angegeben wird, sondern sich in einem Intervall in der Nähe davon bewegen.
Schlussfolgerung
In diesem Artikel haben wir untersucht, wie die von Anwendungen verwendete Bandbreite begrenzt werden kann, die Trickle auf Fedora-basierten Distributionen und Debian/Derivaten verwenden. Weitere mögliche Anwendungsfälle sind unter anderem:
- Begrenzen der Download-Geschwindigkeit über ein Systemprogramm wie wget oder einen Torrent-Client, zum Beispiel.
- Begrenzung der Geschwindigkeit, mit der Ihr System über 'yum' (oder 'aptitude', wenn Sie sich in einem Debian-basierten System befinden), das Paketverwaltungssystem.
- Wenn sich Ihr Server hinter einem Proxy oder einer Firewall befindet (oder der Proxy oder die Firewall selbst ist), können Sie Trickle verwenden, um sowohl die Download- als auch die Upload- oder Kommunikationsgeschwindigkeit mit den Clients oder der Außenseite zu begrenzen.
Fragen und Kommentare sind herzlich willkommen. Fühlen Sie sich frei, das untenstehende Formular zu verwenden, um sie uns zukommen zu lassen.
