- Speedbump adalah proksi TCP yang ditulis dalam Go, yang mensimulasikan kondisi keterlambatan dengan menambahkan latensi jaringan variabel pada traffic TCP yang diproksikan
- Komponen latensi berbentuk gelombang sinus, gelombang gigi gergaji, gelombang persegi, dan gelombang segitiga dapat ditambahkan ke latensi dasar, dan beberapa komponen latensi dapat dikombinasikan secara bersamaan
- Contohnya menunjukkan konfigurasi yang memproksikan traffic menuju
localhost:80dari port2000sambil menerapkan delay dasar100ms, amplitudo sinus100ms, dan periode1m - Instalasi dapat dilakukan dengan mengunduh binary pra-build per rilis, menjalankan
go builddari source, atau menjalankan container imagekffl/speedbump - Selain CLI, Speedbump juga dapat digunakan sebagai library melalui paket
libGo, dengan argumen untuk menyesuaikan ukuran buffer, ukuran antrean delay, level log, host dan port listening, dan lainnya
Proksi untuk simulasi delay TCP
- Speedbump adalah proksi TCP yang ditulis dalam Go dan dapat mensimulasikan latensi jaringan variabel
- Target proksi ditentukan dengan argumen
<destination>pada CLI, dengan format yang dijelaskan sebagaihost:post - Perilaku dasarnya adalah memproksikan traffic TCP ke tujuan sambil menambahkan delay yang dikonfigurasi
Cara instalasi dan menjalankan
- Cara instalasi termudah adalah mengunduh binary pra-build yang otomatis dilampirkan di
Assetspada setiap release - Untuk build dari source, clone repository lalu jalankan
go build - Untuk menjalankannya sebagai container, gunakan image kffl/speedbump
Contoh penggunaan dasar
- Anda dapat listening di port
2000, memproksikan traffic TCP kelocalhost:80, dan menerapkan delay dasar100msserta amplitudo sinus100msdengan periode1m- Konfigurasi ini menghasilkan latensi tambahan maksimum
200msdan latensi tambahan minimum0 - Contoh eksekusinya adalah
speedbump --latency=100ms --sine-amplitude=100ms --sine-period=1m --port=2000 localhost:80
- Konfigurasi ini menghasilkan latensi tambahan maksimum
- Konfigurasi yang sama juga dapat dijalankan dengan container image
- Contohnya adalah
docker run --net=host kffl/speedbump:latest --latency=100ms --sine-amplitude=100ms --sine-period=1m --port=2000 localhost:80
- Contohnya adalah
- Komponen delay gelombang gigi gergaji juga dapat dikonfigurasi
- Contohnya adalah konfigurasi dengan delay dasar
300ms, amplitudo gelombang gigi gergaji200ms, periode2m, port2000, dan tujuanlocalhost:80 - Perintah eksekusinya adalah
speedbump --latency=300ms --saw-amplitude=200ms --saw-period=2m --port=2000 localhost:80
- Contohnya adalah konfigurasi dengan delay dasar
Kombinasi komponen latensi
- Speedbump dapat menerapkan beberapa komponen latensi secara bersamaan
- README menyertakan contoh grafik delay yang mengombinasikan gelombang gigi gergaji dan gelombang sinus
Argumen CLI dan penggunaan sebagai library
speedbump --helpmenyediakan cara penggunaan dalam formatspeedbump [<flags>] <destination>- Pengaturan jaringan utama adalah sebagai berikut
--host: IP atau hostname untuk listening; jika tidak ditentukan, akan bind ke semua interface jaringan--port: port listening, dengan nilai default8000--buffer: ukuran buffer yang digunakan untuk membaca TCP, dengan nilai default64KB--queue-size: ukuran antrean delay untuk menyimpan buffer baca, dengan nilai default1024
- Menyediakan nilai default terkait delay dan opsi waveform
--latency: latensi dasar yang ditambahkan ke traffic proksi, dengan nilai default5ms--sine-amplitude,--sine-period: amplitudo dan periode latensi gelombang sinus--saw-amplitude,--saw-period: amplitudo dan periode latensi gelombang gigi gergaji--square-amplitude,--square-period: amplitudo dan periode latensi gelombang persegi--triangle-amplitude,--triangle-period: amplitudo dan periode latensi gelombang segitiga
- Opsi terkait operasional juga disertakan
--log-level: level log; nilai yang mungkin adalahDEBUG,TRACE,INFO,WARN,ERROR--version: menampilkan versi aplikasi
- Speedbump juga dapat digunakan sebagai library Go, yang disediakan melalui paket
lib - Lisensinya adalah Apache 2.0 License
1 komentar
Opini Hacker News
Saya sempat mencari sesuatu yang mirip untuk menguji berbagai implementasi ActivityPub pada beragam skala dan kondisi jaringan, tetapi ternyata semua yang saya butuhkan sudah terpasang di mesin saya lewat
tcDi distro saya, itu termasuk dalam paket iproute2, dan penjelasannya juga ada di sini: https://wiki.archlinux.org/title/advanced_traffic_control
Untuk menambahkan latensi pada antarmuka tertentu, jalankan seperti
tc qdisc add dev eth0 root netem delay 100msMudah dipakai, bekerja baik di container Docker, bisa menerapkan kondisi seperti latensi, packet loss, dan duplikasi, serta kemungkinan sudah terpasang
tc/netem/tbfbenar-benar bagus. Saya membuat GUI Python sederhana di atasnya dan menjalankannya di Pi yang dimasukkan ke casing layar sentuh; bentuknya seperti kotak hitam kecil dengan “packet drop: [0%] [1%] [10%] [50%] / packet corruption: ...”, dan pelanggan cukup terkesanSaya agak heran frontend semacam itu tidak banyak terlihat sebagai produk hardware komersial; kalau saya tidak melewatkannya dalam pencarian, sepertinya memang belum ada di pasar
tcadalah penerapannya pada paket masuk agak aneh dan merepotkanDulu saya pernah membuat emulator sendiri untuk meniru terminal satelit komersial tertentu. Terminal itu menumpuk paket dalam antrean lalu, ketika ambang tertentu tercapai atau batas waktu terlewati, mengeluarkannya sekaligus dalam satu burst; ia juga “berbaik hati” mengurutkan ulang paket kecil ke bagian depan antrean untuk mengurangi latensi, tetapi stack TCP sangat tidak menyukainya
tctidak bisa melakukan ituIni bisa sangat berguna untuk mensimulasikan pengaruh cuaca pada satelit/RF yang berubah dari waktu ke waktu
Yang dibuat Netflix persis seperti ini, namanya latency monkey
Mereka menyadari bahwa menentukan apakah layanan downstream “lambat” jauh lebih sulit daripada menentukan apakah layanan itu “tidak tersedia”, sehingga ini menjadi cara penting untuk menguji bagaimana layanan menangani perlambatan dan masalah jaringan
Implementasinya sangat sederhana: menjatuhkan paket dengan rasio yang bisa dikonfigurasi, sehingga retransmisi dipaksa dan di sisi lawan paket tiba terlambat serta tidak berurutan
Pada akhirnya, banyak masalah ditemukan pada kode penanganan error terkait akses jaringan
Menurut saya setiap software engineer yang membuat aplikasi internet interaktif wajib menggunakan alat seperti ini dalam pekerjaan sehari-hari. Bukan hanya TCP, tetapi juga QUIC, dan idealnya semua UDP juga perlu dicakup jika ingin menangani DNS
Saya yakin 90% pembengkakan web app akan hilang seandainya para pembuatnya tidak hanya memakai lingkungan komputasi ala Cadillac berlapis emas
https://firefox-source-docs.mozilla.org/devtools-user/networ...
Tentu saja ini hanya berlaku untuk pengujian frontend berbasis browser
Dalam lingkungan dengan koneksi jaringan yang terputus-putus, seperti situasi bantuan bencana, banyak aplikasi berperilaku sangat buruk
Jika lebih banyak pengembang aplikasi menguji dengan mensimulasikan koneksi terputus-putus, itu bisa membantu orang lain
Dari “Toxiproxy is a framework for simulating network conditions” (2021) https://news.ycombinator.com/item?id=29084277#29088775:
Karena yang dikirim hanya paket 50 byte, dan 1 dari 10 paket itu hilang. Sementara itu, satu thread di server tidak melakukan pekerjaan yang berguna
Di Mac, hal yang sama bisa dilakukan hanya dengan tool bawaan
Ada proyek yang sudah tidak aktif cukup lama, tetapi namanya saja sudah menjelaskan banyak hal: https://github.com/tylertreat/comcast
Baru-baru ini saya mencoba mensimulasikan jaringan lambat di Mac dan menemukan Network Link Conditioner; cukup bagus. Tidak perlu menyiapkan semacam proxy
Harus dipasang dari alat tambahan Xcode
https://nshipster.com/network-link-conditioner/
Tool hebat dari Shopify, toxiproxy, juga layak dilihat: https://github.com/Shopify/toxiproxy
Ini juga cara yang sangat baik untuk menguji implementasi library networking buatan sendiri, karena stack harus mampu menangani sebagian besar kondisi buruk dengan benar
Gagasan ‘chaos engineering’ memang keren
Saya sedang mengembangkan progress bar untuk web crawler, dan saat dites di localhost terlalu cepat sehingga sulit mengetahui apakah ada masalah
Dengan speedbump, cukup jalankan
podman run --net=host kffl/speedbump:latest --latency=1s --port=8001 localhost:8000lalu uji crawler di http://localhost:8001Tool yang rapi
Ada tool serupa yang pernah saya pakai di Windows
https://jagt.github.io/clumsy/
FreeBSD juga punya dummynet sebagai bagian dari ipfw, yang bisa menyuntikkan latensi, pembatasan bandwidth, ukuran antrean, dan packet loss. Ini fitur yang sama dengan yang ada di MacOS
tcdi Linux?