8.4. Risoluzione problematiche comuni di perdita dei frame/messa in coda
In numerosi casi la perdita dei frame è dovuta alla saturazione della coda. Il kernel imposta un limite di lunghezza della coda la quale in alcuni casi si può saturare molto velocemente, se questa situazione si protrae per un periodo di tempo molto lungo si può verificare una perdita dei frame.
Come illustrato in Figura 8.1, «Diagramma del percorso di ricezione della rete» sono presenti due code principali nel percorso di ricezione: il NIC Hardware Buffer e la coda del socket. Entrambe queste code devono essere configurate in modo corretto per impedirne la loro saturazione.
8.4.1. NIC Hardware Buffer
Il NIC riempie il proprio buffer hardware con numerosi frame; il buffer viene svuotato da
softirq
il quale viene invocato dal NIC tramite una interruzione. Per interrogare lo stato della coda usare il seguente comando:
ethtool -S ethX
Sostituire
ethX
con il nome del dispositivo corrispondente del NIC. Ciò mostrerà il numero di frame persi all'interno di ethX
. Spesso le perdite si verificano a causa di una carenza di spazio del buffer usato per archiviare i frame.
Per risolvere questo problema usare i metodi di seguito riportati:
- Traffico
- Per impedire la saturazione della coda rallentare il traffico inserito. Per fare questo filtrare il numero di gruppi multicast, riducendo il traffico di trasmissione e operazioni simili.
- Lunghezza della coda
- Alternativamente aumentate la lunghezza della coda. Per fare questo è necessario aumentare il numero di buffer in una coda specifica fino a raggiungere il livello massimo permesso dal driver. Per fare questo modificate i parametri
rx
/tx
diethX
usando:ethtool --set-ring ethX
Inserire i valorirx
otx
al comando sopra indicato. Per maggiori informazioni consultareman ethtool
. - Peso del dispositivo
- È possibile aumentare la velocità con la quale viene "svuotata" una coda. Per fare questo modificare il peso del dispositivo del NIC in modo appropriato. Questo attributo si riferisce al numero massimo di frame che il NIC è in grado di ricevere prima che il contesto
softirq
rilasci la CPU modificando la sua programmazione. L'attributo è controllato da/proc/sys/net/core/dev_weight
.
Molti amministratori tendono ad usare la terza opzione. Tuttavia ricordate che selezionando questa opzione sono presenti alcune limitazioni. Aumentando il numero dei frame ricevibili da un NIC in una iterazione, si avranno cicli aggiuntivi della CPU durante i quali non sarà possibile programmare alcuna applicazione sulla CPU interessata.