¿Cómo puedo priorizar el ancho de banda de la red por aplicación?

20

¿Hay alguna manera en Linux de dar a una aplicación específica más / menos prioridad para el ancho de banda de la red? Algo así como lo nicehace para la prioridad de la CPU.

Contexto: actualmente estoy en una conexión de ancho de banda muy bajo (dongle 3G). Si bien estoy realizando una actualización bastante grande usando aptitude, se vuelve prácticamente imposible navegar por la web ya que la descarga de la actualización está acaparando mi conexión a Internet.

Entonces, lo que me gustaría hacer es disminuir de alguna manera la prioridad del ancho de banda de la red del aptitudeproceso (y todos sus elementos secundarios) para que no use demasiado ancho de banda mientras otro proceso lo está usando.

Trabajo
fuente
¿Aptitude utiliza un puerto específico para sus conexiones? Si es así, puede establecer la prioridad de ese puerto más bajo usando QoS en su enrutador (si su enrutador tiene esa capacidad).
MaQleod
@MaQleod: 1) No, utiliza HTTP para sus descargas. 2) Como estoy en una red 3G, no tengo un enrutador (bueno, no puedo acceder a ninguno de todos modos).
Trabajo
Simplemente limitaría la velocidad de descarga de aptitude / apt en lugar de intentar jugar con su prioridad. Ajústelo a la mitad de su ancho de banda máximo para dejar algo para navegar. He tratado de exponer mi razón para no jugar con QoS en el comentario a la respuesta de Catalin.
vtest

Respuestas:

8

Puede usar force_bind para establecer una prioridad para todos los sockets de una aplicación y luego, usando Linux QoS (comando tc), puede asignar aplicaciones a una banda de prioridad. Consulte el archivo README para ver un ejemplo.

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

Descargo de responsabilidad: soy el autor.

Ejemplo:

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

Por supuesto, puede usar htb o cualquier otro qdisc.

Catalin M. BOIE
fuente
3
Gracias por el descargo de responsabilidad! En el espíritu de Super Usuario, ¡sería genial si pudieras dar el ejemplo aquí para que todos lo vean!
slhck
1
La descarga genera tráfico entrante. QoS puede generar políticas de tráfico saliente, no puede controlar la cantidad de datos entrantes. Para que esto funcione, es necesario controlar el enrutador entre el host e Internet.
vtest
2
trickle(disponible al menos en Ubuntu y Debian) lo hará por usted, así, y podría ser un poco más fácil de usar: trickle -d 1 -u 1 aptitude. Los números son kilobytes.
taneli
1
Con respecto al tráfico entrante, ¿es posible hacer que ciertos tipos de tráfico entrante tengan mayor prioridad sobre otros tipos incluso si no puede controlar el enrutador? @vtest
CMCDragonkai
3
@taneli: tricklese puede usar para configurar un límite de ancho de banda, pero no se puede usar para definir prioridades entre procesos
a3nm