Begrenzung des Netzwerkdurchsatzes eines bereits gestarteten Prozesses? (Linux / FreeBSD)

10

Gibt es ein Dienstprogramm, um den Netzwerkdurchsatz eines Prozesses nach dessen Start zu begrenzen? Einfaches Beispiel: Sie stellen fest, dass ein Benutzer Ihre gesamte Upload-Bandbreite mit scp verwendet und Sie die Rate begrenzen oder die Priorität der Übertragung verringern möchten.

Ich denke, ich könnte eine Kombination von iptables / tc oder pf verwenden, um das zu erreichen, aber ich habe mich gefragt, ob es ein "One-Shot" -Tool gibt (wie Trickle mit einer --pid-Option ^^)?

jbdenis
quelle
Meinten Sie "rieseln"?
Halp
Bearbeiten: Ich nahm an, dass "Rinnsal" beabsichtigt war.
Steven Montag

Antworten:

3

Leider gibt es für FreeBSD keine solche Lösung. Es gibt viele Lösungen wie Dummynet / ipfw oder altq / pf, die verwendet werden, um die Netzwerknutzung basierend auf verschiedenen Mustern, jedoch nicht auf PIDs zu begrenzen.

Unter Linux gibt es eine Möglichkeit, die Netzwerknutzung auf Benutzerbasis einzuschränken:

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner test -j MARK --set-mark 1

Ich denke, es gibt keine Lösung, um die Netzwerkauslastung basierend auf pid zu begrenzen.

Istvan
quelle
2
FreeBSDs ipfw kann auch Verkehr von uid
gelraen
1

lsof des Prozesses, um die Netzwerkports zu erhalten, die der Prozess verwendet. Sobald Sie wissen, welche Ports verwendet werden, können Sie IPTABLES-Regeln verwenden, um die Ratenbegrenzung dieser Ports zu bestimmen. Diese Artikel sollen Ihnen eine bessere Vorstellung geben: http://linux-ip.net/articles/Traffic-Control-HOWTO/ http://blog.edseek.com/~jasonb/articles/traffic_shaping/ http: // wikis. sun.com/pages/viewpage.action?pageId=49906332

Levi
quelle
0

Unter Linux kann sogar die Kombination von iptables und tc ein schwieriges Problem sein, da die Option "--pid-owner" vom iptables-Modul "owner" aufgegeben wurde (siehe Hinweis unter der Tabelle hier ). Tatsächlich scheint nur diese Zuordnung (Paket - Prozess) kompliziert zu sein, während wir den Rest leicht erledigen können, dh Pakete recht effizient filtern und begrenzen.

pitr
quelle
0

Ich glaube nicht, dass es dafür eine fertige Lösung gibt. Mit Standard-Linux-Tools können Sie jedoch ein Skript hacken, das die Aufgabe erfüllt.

Zunächst können Sie eine Liste aller Verbindungen eines bestimmten Prozesses mit lsof abrufen. Anschließend können Sie mit tc Eingangsrichtlinien für diese Verbindungen erstellen.

thor
quelle
0

Wenn Sie den Prozess auf +20 reduzieren, erhält alles andere, was auf dem System ausgeführt wird, Priorität und der Job wird weniger häufig geplant. Daher ist es schwieriger, die Puffer oder Prozesspakete zu füllen, was zu TCP führen sollte Drosselung. Es wird sporadisch sein, könnte aber genug helfen.

# renice 20 -p $pid
Phil P.
quelle
1
Dies ist ein sehr umständlicher Weg, um die Bandbreite zu kontrollieren, und funktioniert wirklich nur, wenn das System sehr stark ausgelastet ist. Auf einem inaktiven System evan wird ein Prozess, der auf -20 umgestellt wurde, immer noch so oft auf die CPU gelangen, wie er möchte.
voretaq7
Richtig, aber wenn dies keine Bandbreite ist, die mit anderen lokalen Computern geteilt wird, ist es Ihnen meistens egal, ob dieser Prozess die gesamte Bandbreite erhält, wenn der Computer inaktiv ist. Nur wenn es einen anderen Prozess gibt, der versucht, die Bandbreite zu nutzen, ist dies von Bedeutung. Möglicherweise haben wir unterschiedliche Definitionen von "sehr stark ausgelastet". Wenn ein anderer Prozess ausgeführt werden soll, erhält er Priorität. Wenn der durchschnittliche Auslastungsgrad> = 1 pro Kern ist, kann dies hilfreich sein. Ich habe bemerkt, dass es grob ist, aber wenn es das einzige verfügbare Tool (FreeBSD) ist, dann ist es zumindest einen Versuch wert.
Phil P