Product SiteDocumentation Site

10.3. Qualità del servizio (QoS)

10.3.1. Principi e meccanismi

Con qualità del servizio (QoS: Quality of Service) ci si riferisce ad un insieme di tecniche che garantiscono o migliorano la qualità del servizio fornito alle applicazioni. La tecnica più diffusa consiste nel classificare il traffico di rete in categorie e differenziare la gestione del traffico in base alla categoria a cui appartiene. La principale applicazione di questa tecnica di differenziazione dei servizi è il traffic shaping, con il quale si limita la velocità di trasmissione dati in base a connessioni relative ad alcuni servizi e/o host per evitare di saturare la banda disponibile ed il collasso di altri servizi importanti. Il traffic shaping è particolarmente adatto al traffico TCP, poiché questo protocollo adatta automaticamente il traffico in base alla larghezza di banda disponibile.
È anche possibile modificare la priorità del traffico, il che permette di dare priorità a pacchetti relativi a servizi interattivi (ad esempio ssh e telnet) o ai servizi che si occupano solo di piccoli blocchi di dati.
I kernel Debian includono le funzionalità richieste per QoS insieme ai relativi moduli. Questi moduli sono molti e ciascuno di essi fornisce un servizio diverso, in particolare mediante speciali funzionalità di pianificazione per le code dei pacchetti IP; il vasto insieme di funzionalità di pianificazione disponibile copre l'intera gamma delle possibili necessità.

10.3.2. Configurazione ed implementazione

Attraverso il comando tc (fornito dal pacchetto iproute) vengono impostati i parametri di QoS. Dal momento che la sua interfaccia è abbastanza complessa, è consigliabile utilizzare strumenti di livello superiore.

10.3.2.1. Ridurre le latenze: wondershaper

Lo scopo principale di wondershaper (nel pacchetto omonimo) è quello di ridurre al minimo le latenze indipendentemente dal carico della rete. Questo risultato è ottenuto limitando il traffico totale a un valore che cade appena sotto il valore di saturazione del collegamento.
Una volta configurata un'interfaccia di rete, l'impostazione della limitazione del traffico è ottenuta eseguendo wondershaper interfaccia velocità_download velocità_upload. L'interfaccia può essere per esempio eth0 o ppp0, entrambe le velocità sono espresse in kilobit al secondo. Il comando wondershaper remove interfaccia disabilita il controllo del traffico sull'interfaccia specificata.
Per una connessione Ethernet, questo script produce un risultato migliore se chiamato subito dopo che l'interfaccia è stata configurata. È possibile ottenere questo risultato aggiungendo le direttive up e down al file /etc/network/interfaces che permettono di dichiarare i comandi da eseguire, rispettivamente dopo aver configurato l'interfaccia e prima che sia disattivata. Ad esempio:

Esempio 10.9. Modifiche nel file /etc/network/interfaces

iface eth0 inet dhcp
    up /sbin/wondershaper eth0 500 100
    down /sbin/wondershaper remove eth0
Nel caso di PPP, la creazione di uno script che richiama wondershaper nella directory /etc/ppp/ip-up.d/ permetterà il controllo del traffico non appena la connessione è attiva.

10.3.2.2. Configurazione standard

Salvo una specifica configurazione di QoS, il kernel Linux usa il pianificatore di coda pfifo_fast, che fornisce alcune interessanti caratteristiche di per sé. La priorità di ogni pacchetto IP processato è basata sul campo ToS (tipo di servizio: Type of Service) del pacchetto stesso; è sufficiente modificare questo campo per sfruttare le funzionalità di pianificazione. Ci sono cinque possibili valori:
  • Normal-Service (0); (servizio normale)
  • Minimize-Cost (2); (minimizza costo)
  • Maximize-Reliability (4); (massimizza affidabilità)
  • Maximize-Throughput (8); (massimizza rendimento)
  • Minimize-Delay (minimizza ritardo) (16).
Il campo ToS può essere impostato da applicazioni che generano i pacchetti IP, o modificato al volo da netfilter. Le seguenti regole sono sufficienti per aumentare la reattività per il servizio SSH di un server:
iptables -t mangle -A PREROUTING -p tcp --sport ssh -j TOS --set-tos Minimize-Delay
iptables -t mangle -A PREROUTING -p tcp --dport ssh -j TOS --set-tos Minimize-Delay