Comment puis-je hiérarchiser la bande passante réseau par application?

20

Existe-t-il un moyen sous Linux de donner une application spécifique plus / moins prioritaire à la bande passante réseau? Quelque chose comme comment nicefonctionne pour la priorité du processeur.

Contexte: Je suis actuellement sur une connexion à très faible bande passante (dongle 3G). Pendant que j'effectue une mise à niveau assez importante à l'aide aptitude, il devient pratiquement impossible de naviguer sur le Web car le téléchargement de la mise à niveau monopolise ma connexion Internet.

Donc, ce que je voudrais faire, c'est en quelque sorte diminuer la priorité de bande passante réseau du aptitudeprocessus (et de tous ses enfants) afin qu'il n'utilise pas trop de bande passante pendant qu'un autre processus l'utilise.

Emploi
la source
Aptitude utilise-t-il un port spécifique pour ses connexions? Si c'est le cas, vous pouvez définir la priorité de ce port plus bas en utilisant la QoS dans votre routeur (si votre routeur a cette capacité).
MaQleod
@MaQleod: 1) Non, il utilise HTTP pour ses téléchargements. 2) Étant donné que je suis sur un réseau 3G, je n'ai pas de routeur (enfin, pas un auquel je puisse accéder de toute façon).
Job
Je voudrais simplement limiter la vitesse de téléchargement d'aptitude / apt au lieu d'essayer de jouer avec sa priorité. Réglez-le sur la moitié de votre bande passante maximale pour en laisser un peu à la navigation. J'ai essayé d'indiquer ma raison pour ne pas jouer avec QoS dans le commentaire de la réponse de Catalin.
vtest

Réponses:

8

Vous pouvez utiliser force_bind pour définir une priorité pour tous les sockets d'une application, puis, à l'aide de Linux QoS (commande tc), vous pouvez affecter des applications à une bande de priorité. Consultez le fichier README pour un exemple.

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

Avertissement: je suis l'auteur.

Exemple:

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

Bien sûr, vous pouvez utiliser htb ou tout autre qdisc.

Catalin M. BOIE
la source
3
Merci pour l'avertissement! Dans l'esprit de Super User, ce serait formidable si vous pouviez donner l'exemple ici à tous!
slhck
1
Le téléchargement génère du trafic entrant. La QoS peut gérer le trafic sortant, elle ne peut pas contrôler la quantité de données entrantes. Pour que cela fonctionne, il est nécessaire de contrôler le routeur entre l'hôte et Internet.
vtest
2
trickle(disponible au moins dans ubuntu et debian) fera pour vous aussi, et peut - être un peu plus facile à utiliser: trickle -d 1 -u 1 aptitude. Les nombres sont en kilo-octets.
taneli
1
En ce qui concerne le trafic entrant, est-il possible de faire en sorte que certains types de trafic entrant aient une priorité plus élevée que d'autres types même si vous ne pouvez pas contrôler le routeur? @vtest
CMCDragonkai
3
@taneli: tricklepeut être utilisé pour configurer une limite de bande passante, mais il ne peut pas être utilisé pour définir des priorités entre les processus
a3nm