Vorrei simulare il ritardo e la perdita di pacchetti per UDP
e TCP
su Linux per misurare le prestazioni di un'applicazione. C'è un modo semplice per fare questo?
Vorrei simulare il ritardo e la perdita di pacchetti per UDP
e TCP
su Linux per misurare le prestazioni di un'applicazione. C'è un modo semplice per fare questo?
Risposte:
netem sfrutta le funzionalità già integrate in Linux e le utilità dello spazio utente per simulare le reti. Questo è in realtà ciò a cui si riferisce la risposta di Mark, con un nome diverso.
Gli esempi sulla loro homepage mostrano già come puoi ottenere ciò che hai chiesto:
Esempi
Emulazione dei ritardi della rete geografica
Questo è l'esempio più semplice, aggiunge solo una quantità fissa di ritardo a tutti i pacchetti che escono dall'Ethernet locale.
# tc qdisc add dev eth0 root netem delay 100ms
Ora un semplice test ping da ospitare sulla rete locale dovrebbe mostrare un aumento di 100 millisecondi. Il ritardo è limitato dalla risoluzione di clock del kernel (Hz). Sulla maggior parte dei sistemi 2.4, l'orologio di sistema funziona a 100 Hz, il che consente ritardi con incrementi di 10 ms. Su 2.6, il valore è un parametro di configurazione da 1000 a 100 Hz.
Gli esempi successivi cambiano semplicemente i parametri senza ricaricare il qdisc
Reti ad ampia area reale mostrano variabilità, quindi è possibile aggiungere variazioni casuali.
# tc qdisc change dev eth0 root netem delay 100ms 10ms
Ciò causa un ritardo aggiunto di 100 ± 10 ms. La variazione del ritardo di rete non è puramente casuale, quindi per emulare che esiste anche un valore di correlazione.
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
Questo fa sì che il ritardo aggiunto sia di 100 ± 10 ms con il successivo elemento casuale dipendente del 25% dall'ultimo. Questa non è una vera correlazione statistica, ma un'approssimazione.
Ritardare la distribuzione
In genere, il ritardo in una rete non è uniforme. È più comune usare qualcosa come una normale distribuzione per descrivere la variazione in ritardo. La disciplina netem può prendere una tabella per specificare una distribuzione non uniforme.
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
Le tabelle effettive (normale, pareto, paretonormale) sono generate come parte della compilazione iproute2 e inserite in / usr / lib / tc; quindi è possibile con qualche sforzo creare la propria distribuzione sulla base di dati sperimentali.
Perdita di pacchetti
La perdita casuale di pacchetti è specificata nel comando 'tc' in percentuale. Il valore minimo diverso da zero possibile è:
2 −32 = 0,0000000232%
# tc qdisc change dev eth0 root netem loss 0.1%
Questo fa sì che i pacchetti dell'1 / 10% (ovvero 1 su 1000) vengano eliminati casualmente.
È inoltre possibile aggiungere una correlazione facoltativa. Questo fa sì che il generatore di numeri casuali sia meno casuale e possa essere usato per emulare le perdite di scoppio dei pacchetti.
# tc qdisc change dev eth0 root netem loss 0.3% 25%
Ciò causerà la perdita dello 0,3% dei pacchetti e ogni probabilità successiva dipende di un quarto dall'ultima.
Prob n = 0,25 × Prob n-1 + 0,75 × Casuale
Nota che dovresti usare tc qdisc add
se non hai regole per quell'interfaccia o tc qdisc change
se hai già regole per quell'interfaccia. Il tentativo di utilizzare tc qdisc change
un'interfaccia senza regole genererà l'errore RTNETLINK answers: No such file or directory
.
tc -p qdisc ls dev eth0
elencherà le regole attualmente definite e tc qdisc del dev eth0 root
le eliminerà
Per i pacchetti rilasciati utilizzerei semplicemente iptables e il modulo statistico .
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
Sopra lascerà cadere un pacchetto in arrivo con una probabilità dell'1%. Fai attenzione, qualsiasi cosa al di sopra di circa 0,14 e la maggior parte delle tue connessioni tcp probabilmente si bloccheranno completamente.
Dai un'occhiata a man iptables e cerca "statistic" per ulteriori informazioni.
DROP
sulle connessioni in uscita provoca in modo piuttosto ridicolo il send()
ritorno delle operazioni EPERM
, piuttosto che semplicemente il rilascio di pacchetti (come dovrebbe).
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
Uno dei miei colleghi usa TC per fare questo. Fare riferimento alla pagina man per ulteriori informazioni. Puoi vedere un esempio del suo utilizzo qui .
Questo tutorial sulle simulazioni fisiche di rete contiene una classe C ++ nel codice di esempio per simulare la latenza e la perdita di pacchetti in una connessione UDP e può essere di orientamento. Vedere le variabili di latenza pubblica e packetLoss della classe Connection rilevate nel file Connection.h del codice sorgente scaricabile .
Non l'ho provato da solo, ma questa pagina ha un elenco di moduli plug-in che girano nel sistema di filtraggio IP iptables integrato di Linux. Uno dei moduli è chiamato "nth" e consente di impostare una regola che eliminerà una velocità configurabile dei pacchetti. Potrebbe essere un buon punto di partenza, almeno.
Puoi provare http://snad.ncsl.nist.gov/nistnet/ È un progetto NIST piuttosto vecchio (ultima versione 2005), ma funziona per me.
Saboteur è uno strumento di iniezione di guasti di rete facile da usare . Può simulare:
- Partizione di rete totale
- Servizio remoto guasto (non in ascolto sulla porta prevista)
- ritardi
- Perdita di pacchetti - Timeout della connessione TCP (come spesso accade quando due sistemi sono separati da un firewall stateful)
Uno degli strumenti più utilizzati nella comunità scientifica a tale scopo è DummyNet . Dopo aver installato il ipfw
modulo del kernel, per introdurre un ritardo di propagazione di 50ms tra 2 macchine è sufficiente eseguire questi comandi:
./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2
Per introdurre anche il 50% delle perdite di pacchetti è necessario eseguire:
./ipfw pipe 1 config plr 0.5
Qui maggiori dettagli.