Speedbump - Değişken gecikme destekli TCP proxy
(github.com/kffl)- Speedbump, Go ile yazılmış bir TCP proxy’dir; proxy’den geçen TCP trafiğine değişken ağ gecikmesi ekleyerek gecikme senaryolarını simüle eder
- Temel gecikmeye sinüs dalgası, testere dişi dalga, kare dalga, üçgen dalga biçiminde gecikme bileşenleri eklenebilir; birden çok gecikme bileşeni aynı anda birleştirilebilir
- Örnek,
localhost:80hedefli trafiği2000portunda proxy’lerken100mstemel gecikme,100mssinüs dalgası genliği ve1mperiyodu uygulayan bir yapılandırmayı gösterir - Kurulum; sürümlere göre önceden derlenmiş ikili dosyayı indirme, kaynaktan
go buildile derleme veyakffl/speedbumpkonteyner imajını çalıştırma yoluyla yapılabilir - CLI dışında Go’nun
libpaketi üzerinden kütüphane olarak da kullanılabilir; tampon boyutu, gecikme kuyruğu boyutu, günlük seviyesi, dinleme host’u ve portu gibi değerler argümanlarla ayarlanabilir
TCP gecikme simülasyonu için proxy
- Speedbump, Go ile yazılmış bir TCP proxy’dir ve değişken ağ gecikmesini simüle edebilir
- Proxy hedefi CLI’daki
<destination>argümanıyla belirtilir; biçimhost:postolarak gösterilmiştir - Temel çalışma şekli, TCP trafiğini hedefe proxy’lerken yapılandırılan gecikmeyi eklemektir
Kurulum ve çalıştırma yöntemleri
- En kolay kurulum yöntemi, her release için
Assetsbölümüne otomatik eklenen önceden derlenmiş ikili dosyayı indirmektir - Kaynaktan derlemek için depoyu klonladıktan sonra
go buildçalıştırılır - Konteyner olarak çalıştırmak için kffl/speedbump imajı kullanılabilir
Temel kullanım örneği
2000portunda dinleyip TCP trafiğinilocalhost:80adresine proxy’lerken100mstemel gecikme,100mssinüs dalgası genliği ve1mperiyodu uygulanabilir- Bu yapılandırma en fazla
200ms, en az0ek gecikme oluşturur - Çalıştırma örneği:
speedbump --latency=100ms --sine-amplitude=100ms --sine-period=1m --port=2000 localhost:80
- Bu yapılandırma en fazla
- Aynı yapılandırma konteyner imajıyla da çalıştırılabilir
- Örnek:
docker run --net=host kffl/speedbump:latest --latency=100ms --sine-amplitude=100ms --sine-period=1m --port=2000 localhost:80
- Örnek:
- Testere dişi dalga gecikme bileşeni de ayarlanabilir
- Örnek;
300mstemel gecikme,200mstestere dişi dalga genliği,2mperiyot,2000portu velocalhost:80hedefinden oluşan bir yapılandırmadır - Çalıştırma komutu:
speedbump --latency=300ms --saw-amplitude=200ms --saw-period=2m --port=2000 localhost:80
- Örnek;
Gecikme bileşenlerini birleştirme
- Speedbump, birden çok gecikme bileşenini aynı anda uygulayabilir
- README, testere dişi dalga ile sinüs dalgasını birleştiren gecikme grafiği örneği içerir
CLI argümanları ve kütüphane olarak kullanım
speedbump --help,speedbump [<flags>] <destination>biçiminde kullanım bilgisi sunar- Başlıca ağ ayarları şöyledir
--host: Dinlenecek IP veya host adı; belirtilmezse tüm ağ arayüzlerine bağlanır--port: Dinleme portu; varsayılan değer8000’dir--buffer: TCP okumada kullanılan tampon boyutu; varsayılan değer64KB’dir--queue-size: Okuma tamponlarını saklayan gecikme kuyruğu boyutu; varsayılan değer1024’tür
- Gecikmeyle ilgili varsayılanlar ve dalga biçimi seçenekleri sunar
--latency: Proxy trafiğine eklenen temel gecikme; varsayılan değer5ms’dir--sine-amplitude,--sine-period: Sinüs dalgası gecikme genliği ve periyodu--saw-amplitude,--saw-period: Testere dişi dalga gecikme genliği ve periyodu--square-amplitude,--square-period: Kare dalga gecikme genliği ve periyodu--triangle-amplitude,--triangle-period: Üçgen dalga gecikme genliği ve periyodu
- Operasyonla ilgili seçenekler de bulunur
--log-level: Günlük seviyesi; olası değerlerDEBUG,TRACE,INFO,WARN,ERROR--version: Uygulama sürümünü gösterir
- Speedbump, Go kütüphanesi olarak da kullanılabilir ve
libpaketi üzerinden sunulur - Lisansı Apache 2.0 License’tır
1 yorum
Hacker News yorumları
Çeşitli ActivityPub uygulamalarını farklı ağ ölçekleri ve koşullarında test etmek için benzer bir şey araştırmıştım; meğer makinemde ihtiyaç duyduğum her şey
tcile zaten kuruluymuşBenim dağıtımımda iproute2 paketinin içindeydi; açıklaması burada da var: https://wiki.archlinux.org/title/advanced_traffic_control
Belirli bir arayüze gecikme eklemek için
tc qdisc add dev eth0 root netem delay 100msgibi çalıştırabilirsinizKullanımı kolay, Docker container'larında da iyi çalışıyor; gecikme, paket kaybı, yineleme gibi koşulları uygulayabiliyor ve muhtemelen zaten kurulu olabilir
tc/netem/tbfgerçekten çok iyi. Bunun üzerine basit bir Python GUI yaptım ve dokunmatik ekranlı bir kasaya yerleştirilmiş Pi üzerinde çalıştırdım; “Paket düşürme: [0%] [1%] [10%] [50%] / Paket bozulması: ...” gibi küçük siyah bir kutuydu ve müşteriler epey etkilenmiştiBenzer bir ön yüzün ticari donanım ürünü olarak pek görünmemesi şaşırtıcı; aramalarda kaçırmadıysam piyasada yok gibi
tcnin dezavantajı, gelen paketlere uygulamak istediğinizde biraz tuhaf ve zahmetli olmasıBir zamanlar belirli bir ticari uydu terminalini taklit etmek için kendi emülatörümü yapmıştım. Bu terminal paketleri kuyruğa alıyor, belirli bir eşiğe ulaştığında veya zaman aşımını geçtiğinde hepsini bir blok halinde dışarı fırlatıyordu; küçük paketleri “nazikçe” kuyruğun önüne yeniden sıralayıp gecikmeyi azaltmaya çalışıyordu ama TCP yığını bundan hiç hoşlanmıyordu
tcbunu yapamıyorZamanla değişen uydu/RF hava etkilerini simüle etmek için oldukça kullanışlı olabilir
Netflix'in yaptığı şey tam olarak buydu; adı latency monkey idi
Alt hizmetin “yavaş” olup olmadığını belirlemenin “kullanılamaz” olup olmadığını belirlemekten çok daha zor olduğunu öğrendik; bu yüzden hizmet yavaşlamasını ve ağ sorunlarını nasıl ele aldığını test etmenin önemli bir yoluydu
Uygulaması çok basitti: yapılandırılabilir bir oranla paketleri düşürüyordu; bu da yeniden iletimi zorunlu kılıyor, karşı tarafa paketlerin gecikmeli ve sırası karışmış şekilde ulaşmasına neden oluyordu
Sonuçta ağ erişimiyle ilgili hata işleme kodunda birçok sorun bulduk
Etkileşimli internet uygulamaları geliştiren her yazılım mühendisi, günlük işinde mutlaka böyle araçlar kullanmalı diye düşünüyorum. Yalnızca TCP değil, QUIC de gerekli; DNS'i de yakalamak için ideal olarak tüm UDP de dahil olmalı
Bunları geliştirenler yalnızca altın kaplama Cadillac gibi bilgi işlem ortamları kullanmasaydı, web uygulaması şişkinliğinin %90'ının ortadan kalkacağına eminim
https://firefox-source-docs.mozilla.org/devtools-user/networ...
Elbette bu yalnızca ön yüz, tarayıcı tabanlı testler için geçerli
Afet yardımı gibi ağ bağlantısının aralıklı olarak koptuğu ortamlarda birçok uygulama berbat çalışıyor
Daha fazla uygulama geliştiricisi aralıklı bağlantıyı simüle edip test etse başkalarına faydası olabilir
“Toxiproxy is a framework for simulating network conditions” (2021) https://news.ycombinator.com/item?id=29084277#29088775 başlığında geçenler:
Çünkü sadece 50 baytlık paketler gönderiyorsunuz ve bunların 10'da 1'i kayboluyor. Bu sırada sunucudaki bir thread işe yarar hiçbir şey yapamıyor
Mac'te yerleşik araçlarla da aynı şeyi yapabilirsiniz
Bir süredir pasif olan ama adı tek başına çok şey anlatan bir proje var: https://github.com/tylertreat/comcast
Yakın zamanda Mac'te yavaş ağı simüle etmeye çalışırken Network Link Conditioner'ı buldum; oldukça iyi. Proxy gibi bir şey ayarlamaya gerek yok
Xcode ek araçlarından kurulması gerekiyor
https://nshipster.com/network-link-conditioner/
Shopify'ın harika aracı toxiproxy de bakmaya değer: https://github.com/Shopify/toxiproxy
Ağ kütüphanesini bizzat geliştirip test etmek için de çok iyi bir yöntem. Çünkü yığının olumsuz durumların çoğunu düzgün şekilde ele alabilmesi gerekir
‘Kaos mühendisliği’ fikri güzel
Bir web crawler için ilerleme çubuğu geliştiriyorum; localhost'ta test edince çok hızlı olduğu için bir sorun olup olmadığını anlamak zorlaşıyor
speedbump ile sadece
podman run --net=host kffl/speedbump:latest --latency=1s --port=8001 localhost:8000çalıştırıp crawler'ı http://localhost:8001 üzerinden test etmek yeterliTemiz bir araç
Windows'ta kullandığım benzer bir araç var
https://jagt.github.io/clumsy/
FreeBSD'de de ipfw'nin parçası olarak dummynet var; gecikme, bant genişliği sınırlaması, kuyruk boyutu ve paket kaybı enjekte edebiliyor. MacOS'takiyle aynı işlev
tcile aynı şey mi?