Simula pacchetti ritardati e rilasciati su Linux


Risposte:


323

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 addse non hai regole per quell'interfaccia o tc qdisc changese hai già regole per quell'interfaccia. Il tentativo di utilizzare tc qdisc changeun'interfaccia senza regole genererà l'errore RTNETLINK answers: No such file or directory.


2
Il sito Web originale ha questo errore, ho appena copiato direttamente quel testo. Ma sì, 2 ^ (- 32) = 2,33e-10
effimero

34
Nota che tc -p qdisc ls dev eth0elencherà le regole attualmente definite e tc qdisc del dev eth0 rootle eliminerà
Quamis

1
votato per aver segnalato l'errore quando si tenta di modificare una voce inesistente
Neo

Sai perché visualizzo questi errori? ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / RISULTATI $ sudo tc qdisc aggiungi dev eth0 root netem delay 100ms RTNETLINK risponde: il file esiste ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / RISULTATI $ sudo tc qdisc change dev eth0 root netem delay 100ms RTNETLINK risponde: argomento non valido serverfault.com/questions/743885/…
Mona Jalal

Probabilmente sarebbe una buona idea includere dettagli su come limitare la velocità dell'intera interfaccia per simulare collegamenti a bassa velocità
Pavel P

91

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.


6
Perché le connessioni TCP dovrebbero bloccarsi a un livello superiore al 14%?
David Wolever il

2
@DavidWolever: a causa del modo in cui viene regolata la dimensione delle finestre scorrevoli tcp. Ma il 14% è puramente per esperienza, provalo tu stesso e vedrai che ssh diventa per lo più inutilizzabile al 14% e oltre, ma in realtà funziona abbastanza bene a livelli più bassi di cadute di pacchetti.
Bjarke Freund-Hansen,

12
Per motivi di sicurezza, probabilmente è meglio limitare la regola da applicare solo alle porte che si desidera testare: iptables -A INPUT --dport FOO -m statistics .... In questo modo, il tuo ssh e altre connessioni rimanere non molestato e si può aumentare il tasso di abbandono affinché il servizio di interesse sia in grado di riprodurre più velocemente eventuali problemi con esso.
Mikhail T.

5
Si noti che DROPsulle connessioni in uscita provoca in modo piuttosto ridicolo il send()ritorno delle operazioni EPERM, piuttosto che semplicemente il rilascio di pacchetti (come dovrebbe).
Nome falso

2
È tutto ciò che serve per annullare quel comando? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314,

6

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 .


Penso che sia più facile usare iptables :)
c4f4t0r

certo, ma tc è molto più veloce di iptables
teknoraver,

5

iptables (8) ha un modulo di corrispondenza statistica che può essere usato per abbinare ogni ennesimo pacchetto. Per eliminare questo pacchetto, basta aggiungere -j DROP .



1

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.



1

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)

1
Purtroppo, l'ultimo impegno per quel progetto è stato il 28 agosto 2015, cioè quasi 4 anni fa. I numeri aperti ora hanno 5 anni.
Ali,

1

Uno degli strumenti più utilizzati nella comunità scientifica a tale scopo è DummyNet . Dopo aver installato il ipfwmodulo 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.