Come posso dare priorità alla larghezza di banda della rete in base all'applicazione?


20

Esiste un modo in Linux per dare a un'applicazione specifica più / meno priorità per la larghezza di banda della rete? Qualcosa come nicefare per la priorità della CPU.

Contesto: attualmente sto utilizzando una connessione a larghezza di banda molto bassa (dongle 3G). Mentre sto eseguendo un aggiornamento abbastanza grande usando aptitude, diventa praticamente impossibile navigare sul web poiché il download dell'aggiornamento sta ostacolando la mia connessione a Internet.

Quindi quello che vorrei fare è in qualche modo ridurre la priorità della larghezza di banda della rete del aptitudeprocesso (e tutti i suoi figli) in modo che non utilizzi troppa larghezza di banda mentre un altro processo lo sta usando.


Aptitude utilizza una porta specifica per le sue connessioni? In tal caso, è possibile impostare una priorità inferiore di quella porta utilizzando QoS nel router (se il router dispone di tale funzionalità).
MaQleod,

@MaQleod: 1) No, utilizza HTTP per i suoi download. 2) Dal momento che sono su una rete 3G, non ho un router (beh, non posso accedervi comunque).
Giobbe

Vorrei solo limitare la velocità di download di aptitude / apt invece di provare a giocare con la sua priorità. Impostalo a metà della larghezza di banda massima per lasciarne un po 'per la navigazione. Ho cercato di indicare la mia ragione per non giocare con QoS nel commento alla risposta di Catalin.
vtest

Risposte:


8

È possibile utilizzare force_bind per impostare una priorità per tutti i socket di un'applicazione e quindi, utilizzando Linux QoS (comando tc), è possibile assegnare le applicazioni a una banda prioritaria. Controllare il file README per un esempio.

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

Disclaimer: sono l'autore.

Esempio:

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

Ovviamente, puoi usare htb o qualsiasi altro qdisc.


3
Grazie per la dichiarazione di non responsabilità! Nello spirito di Super User, sarebbe bello se tu potessi fornire l'esempio qui da vedere a tutti!
slhck,

1
Il download genera traffico in entrata. QoS può gestire il traffico in uscita, non può controllare la quantità di dati in arrivo. Perché questo funzioni, è necessario controllare il router tra l'host e Internet.
vtest

2
trickle(disponibile almeno in Ubuntu e Debian) lo farà per voi pure, e potrebbe essere un po 'più facile da usare: trickle -d 1 -u 1 aptitude. I numeri sono kilobyte.
Taneli,

1
Per quanto riguarda il traffico in entrata, è possibile fare in modo che alcuni tipi di traffico in entrata abbiano una priorità maggiore rispetto ad altri tipi anche se non si riesce a controllare il router? @vtest
CMCDragonkai

3
@taneli: tricklepuò essere utilizzato per impostare un limite di larghezza di banda, ma non può essere utilizzato per definire le priorità tra i processi
a3nm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.