Saya ingin mensimulasikan penundaan dan hilangnya paket untuk UDP
dan TCP
di Linux untuk mengukur kinerja suatu aplikasi. Apakah ada cara sederhana untuk melakukan hal ini?
Saya ingin mensimulasikan penundaan dan hilangnya paket untuk UDP
dan TCP
di Linux untuk mengukur kinerja suatu aplikasi. Apakah ada cara sederhana untuk melakukan hal ini?
Jawaban:
netem memanfaatkan fungsionalitas yang sudah ada di Linux dan utilitas userspace untuk mensimulasikan jaringan. Inilah sebenarnya yang dimaksud oleh jawaban Markus, dengan nama yang berbeda.
Contoh di beranda mereka sudah menunjukkan bagaimana Anda dapat mencapai apa yang Anda minta:
Contohnya
Meniru penundaan jaringan area luas
Ini adalah contoh paling sederhana, itu hanya menambah jumlah penundaan tetap untuk semua paket keluar dari Ethernet lokal.
# tc qdisc add dev eth0 root netem delay 100ms
Sekarang tes ping sederhana untuk menjadi tuan rumah di jaringan lokal akan menunjukkan peningkatan 100 milidetik. Penundaan dibatasi oleh resolusi clock dari kernel (Hz). Pada sebagian besar sistem 2.4, jam sistem beroperasi pada 100 Hz yang memungkinkan penundaan peningkatan 10 ms. Pada 2.6, nilainya adalah parameter konfigurasi dari 1000 hingga 100 Hz.
Contoh selanjutnya hanya mengubah parameter tanpa memuat ulang qdisc
Jaringan luas nyata menunjukkan variabilitas sehingga dimungkinkan untuk menambahkan variasi acak.
# tc qdisc change dev eth0 root netem delay 100ms 10ms
Ini menyebabkan penundaan yang ditambahkan menjadi 100 ± 10 ms. Variasi keterlambatan jaringan tidak sepenuhnya acak, jadi untuk meniru bahwa ada nilai korelasi juga.
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
Ini menyebabkan keterlambatan yang ditambahkan menjadi 100 ± 10 ms dengan elemen acak berikutnya tergantung 25% pada yang terakhir. Ini bukan korelasi statistik yang sebenarnya, tetapi perkiraan.
Keterlambatan distribusi
Biasanya, keterlambatan dalam jaringan tidak seragam. Lebih umum menggunakan sesuatu seperti distribusi normal untuk menggambarkan variasi dalam penundaan. Disiplin netem dapat mengambil tabel untuk menentukan distribusi yang tidak seragam.
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
Tabel aktual (normal, pareto, paretonormal) dihasilkan sebagai bagian dari kompilasi iproute2 dan ditempatkan di / usr / lib / tc; jadi dimungkinkan dengan upaya untuk membuat distribusi Anda sendiri berdasarkan data eksperimental.
Paket hilang
Kehilangan paket acak ditentukan dalam perintah 'tc' dalam persen. Nilai non-nol terkecil yang mungkin adalah:
2 −32 = 0,0000000232%
# tc qdisc change dev eth0 root netem loss 0.1%
Hal ini menyebabkan 1/10 dari persen (yaitu 1 dari 1000) paket akan secara acak dijatuhkan.
Korelasi opsional juga dapat ditambahkan. Hal ini menyebabkan generator angka acak menjadi kurang acak dan dapat digunakan untuk meniru paket burst loss.
# tc qdisc change dev eth0 root netem loss 0.3% 25%
Ini akan menyebabkan 0,3% paket hilang, dan setiap probabilitas berturut-turut tergantung pada seperempat pada yang terakhir.
Prob n = 0,25 × Prob n-1 + 0,75 × Acak
Perhatikan bahwa Anda harus menggunakan tc qdisc add
jika Anda tidak memiliki aturan untuk antarmuka itu atau tc qdisc change
jika Anda sudah memiliki aturan untuk antarmuka itu. Mencoba menggunakan tc qdisc change
antarmuka tanpa aturan akan memberikan kesalahan RTNETLINK answers: No such file or directory
.
tc -p qdisc ls dev eth0
akan mencantumkan aturan yang ditetapkan saat ini, dan tc qdisc del dev eth0 root
akan menghapusnya
Untuk paket yang dijatuhkan, saya hanya akan menggunakan iptables dan modul statistik .
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
Di atas akan menjatuhkan paket yang masuk dengan probabilitas 1%. Hati-hati, apa pun di atas sekitar 0,14 dan sebagian besar dari Anda koneksi tcp kemungkinan besar akan macet sepenuhnya.
Lihatlah man iptables dan cari "statistik" untuk informasi lebih lanjut.
DROP
pada koneksi keluar agak konyol menyebabkan send()
operasi kembali EPERM
, bukan hanya menjatuhkan paket (seperti seharusnya).
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
Salah satu kolega saya menggunakan tc untuk melakukan ini. Lihat halaman manual untuk informasi lebih lanjut. Anda dapat melihat contoh penggunaannya di sini .
Ini tutorial tentang simulasi fisika jaringan berisi C ++ class dalam kode contoh untuk simulasi latency dan packet loss di koneksi UDP dan mungkin bimbingan. Lihat variabel latensi publik dan packetLoss dari kelas Connection yang ditemukan di file Connection.h dari kode sumber yang dapat diunduh .
Belum mencobanya sendiri, tetapi halaman ini memiliki daftar modul plugin yang berjalan di sistem penyaringan IP iptables bawaan Linux. Salah satu modul disebut "n", dan memungkinkan Anda untuk mengatur aturan yang akan menurunkan tingkat paket yang dapat dikonfigurasi. Paling tidak bisa menjadi tempat yang baik untuk memulai.
Anda dapat mencoba http://snad.ncsl.nist.gov/nistnet/ Ini proyek NIST yang cukup lama (rilis terakhir 2005), tetapi berhasil untuk saya.
Alat injeksi jaringan yang mudah digunakan adalah Saboteur . Itu dapat mensimulasikan:
- Total partisi jaringan
- Layanan jauh mati (tidak mendengarkan pada port yang diharapkan)
- Keterlambatan
- Kehilangan paket - Batas waktu koneksiTCP (seperti yang sering terjadi ketika dua sistem dipisahkan oleh firewall stateful)
Salah satu alat yang paling banyak digunakan dalam komunitas ilmiah untuk tujuan itu adalah DummyNet . Setelah Anda menginstal ipfw
modul kernel, untuk memperkenalkan jeda propagasi 50 ms antara 2 mesin, jalankan saja perintah-perintah ini:
./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2
Untuk juga memperkenalkan 50% paket loss Anda harus menjalankan:
./ipfw pipe 1 config plr 0.5
Sini lebih detail.