Como posso priorizar a largura de banda da rede por aplicativo?

20

Existe uma maneira no Linux de dar a um aplicativo específico mais / menos prioridade para a largura de banda da rede? Algo como a niceprioridade da CPU.

Contexto: Atualmente, estou com uma conexão de largura de banda muito baixa (dongle 3G). Enquanto estou realizando uma atualização bastante grande usando aptitude, torna-se praticamente impossível navegar na Web, pois o download da atualização está prejudicando minha conexão com a Internet.

Então, o que eu gostaria de fazer é diminuir a prioridade da largura de banda da rede do aptitudeprocesso (e todos os seus filhos) para que ela não use muita largura de banda enquanto outro processo a estiver usando.

Trabalho
fonte
O aptitude usa uma porta específica para suas conexões? Nesse caso, você pode definir a prioridade dessa porta mais baixa usando QoS no seu roteador (se o seu roteador tiver essa capacidade).
MaQleod
@MaQleod: 1) Não, ele usa HTTP para seus downloads. 2) Como estou em uma rede 3G, não tenho roteador (bem, nenhum que eu possa acessar de qualquer maneira).
Job
Eu classificaria apenas a velocidade de download do aptitude / apt em vez de tentar jogar com sua prioridade. Defina como metade da sua largura de banda máxima para deixar alguns para navegar. Tentei declarar minha razão para não jogar com QoS no comentário à resposta de Catalin.
vtest

Respostas:

8

Você pode usar o force_bind para definir uma prioridade para todos os soquetes de um aplicativo e, em seguida, usando o QoS do Linux (comando tc), é possível atribuir aplicativos a uma banda de prioridade. Verifique o arquivo README para um exemplo.

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

Disclaimer: Eu sou o autor.

Exemplo:

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

Obviamente, você pode usar o htb ou qualquer outro qdisc.

Catalin M. BOIE
fonte
3
Obrigado pelo aviso! No espírito de superusuário, seria ótimo se você pudesse fornecer o exemplo aqui para todos verem!
slhck
11
O download gera tráfego de entrada. A QoS pode orientar o tráfego de saída, não pode controlar a quantidade de dados recebidos. Para que isso funcione, é necessário controlar o roteador entre o host e a Internet.
vtest
2
trickle(disponível pelo menos em Ubuntu e Debian) vai fazer isso por você também, e pode ser um pouco mais fácil de usar: trickle -d 1 -u 1 aptitude. Os números são kilobytes.
Taneli
11
Em relação ao tráfego de entrada, é possível fazer com que certos tipos de tráfego de entrada tenham maior prioridade sobre outros tipos, mesmo que você não possa controlar o roteador? @vtest
CMCDragonkai
3
@taneli: tricklepode ser usado para configurar um limite de largura de banda, mas não pode ser usado para definir prioridades entre processos
a3nm