Wie kann ich die Netzwerkbandbreite pro Anwendung priorisieren?

20

Gibt es in Linux eine Möglichkeit, einer bestimmten Anwendung mehr oder weniger Priorität für die Netzwerkbandbreite zu geben? So ähnlich wie nicebei CPU-Priorität.

Kontext: Ich verwende derzeit eine Verbindung mit sehr geringer Bandbreite (3G-Dongle). Während ich mit ein ziemlich umfangreiches Upgrade durchführe aptitude, wird es praktisch unmöglich, im Internet zu surfen, da der Upgrade-Download meine Internetverbindung beeinträchtigt.

Was ich also tun möchte, ist, die Netzwerkbandbreitenpriorität des aptitudeProzesses (und aller seiner untergeordneten Prozesse) zu verringern , damit er nicht zu viel Bandbreite verwendet, während ein anderer Prozess ihn verwendet.

Job
quelle
Verwendet aptitude einen bestimmten Port für seine Verbindungen? In diesem Fall können Sie die Priorität dieses Ports mithilfe von QoS in Ihrem Router verringern (sofern Ihr Router über diese Funktion verfügt).
MaQleod
@ MaQleod: 1) Nein, es verwendet HTTP für seine Downloads. 2) Da ich in einem 3G-Netzwerk bin, habe ich keinen Router (auf den ich sowieso nicht zugreifen kann).
Job
Ich würde nur die Download-Geschwindigkeit von aptitude / apt bewerten, anstatt zu versuchen, mit seiner Priorität zu spielen. Stellen Sie die Hälfte Ihrer maximalen Bandbreite ein, um einige zum Durchsuchen zuzulassen. Ich habe versucht, im Kommentar zu Catalins Antwort den Grund anzugeben, warum ich nicht mit QoS spiele.
vtest

Antworten:

8

Sie können force_bind verwenden, um eine Priorität für alle Sockets einer Anwendung festzulegen, und dann mithilfe von Linux QoS (Befehl tc) Anwendungen einem Prioritätsband zuweisen. Überprüfen Sie die README-Datei für ein Beispiel.

http://kernel.embedromix.ro/us/

Haftungsausschluss: Ich bin der Autor.

Beispiel:

14: Force priority (between 0 and 6 for non-root users). You can
        use 'tc' command from iproute to set-up 'prio' qdisc and to
        assign prio to queues:
        # 0. setup
        export FORCE_NET_VERBOSE=1
        export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
        # 1. Make sure you have a 'prio' qdisc attached to eth0, for example:
        tc qdisc add ev eth0 root handle 1: prio
        # 2. Assign applications to classed (bands):
        export FORCE_NET_PRIO=6 # interactive, band 0
        your_voip_program_here
        export FORCE_NET_PRIO=0 # best effort, band 1
        your_mail_program_here
        export FORCE_NET_PRIO=2 # bulk, band 2
        your_remote_backup_program_here
        # 3. Run tc statistics so you can see the classification:
        tc -s class show dev eth0

Natürlich können Sie auch htb oder eine andere qdisc verwenden.

Catalin M. BOIE
quelle
3
Danke für den Disclaimer! Im Sinne von Super User wäre es großartig, wenn Sie das Beispiel hier für alle sichtbar machen könnten!
Slhck
1
Durch das Herunterladen wird eingehender Datenverkehr generiert. QoS kann ausgehenden Datenverkehr überwachen und die Menge der eingehenden Daten nicht steuern. Damit dies funktioniert, muss der Router zwischen dem Host und dem Internet gesteuert werden.
vtest
2
trickle(erhältlich zumindest in ubuntu und debian) wird das auch für Sie tun, und vielleicht ein bisschen einfacher zu bedienen sein: trickle -d 1 -u 1 aptitude. Zahlen sind Kilobyte.
Taneli
1
Ist es in Bezug auf eingehenden Datenverkehr möglich, dass bestimmte Arten von eingehendem Datenverkehr Vorrang vor anderen Arten haben, auch wenn Sie den Router nicht steuern können? @ vtest
CMCDragonkai
3
@taneli: tricklekann zur Einrichtung eines Bandbreitenlimits verwendet werden, kann jedoch nicht zur Definition von Prioritäten zwischen Prozessen verwendet werden
a3nm