Speedbump - वैरिएबल लेटेंसी सपोर्ट करने वाला TCP प्रॉक्सी
(github.com/kffl)- Speedbump Go में लिखा गया TCP प्रॉक्सी है, जो प्रॉक्सी किए जा रहे TCP ट्रैफिक में वैरिएबल नेटवर्क लेटेंसी जोड़कर देरी की स्थितियों को simulate करता है
- बेस लेटेंसी में sine wave, sawtooth wave, square wave, triangle wave के रूप में लेटेंसी components जोड़े जा सकते हैं, और कई लेटेंसी components को एक साथ combine किया जा सकता है
- उदाहरण में
localhost:80की ओर जाने वाले ट्रैफिक को पोर्ट2000पर प्रॉक्सी करते हुए100msबेस delay,100mssine wave amplitude और1mperiod लागू करने वाला configuration दिखाया गया है - इंस्टॉलेशन release-wise prebuilt binary download करके, source से
go buildचलाकर, याkffl/speedbumpcontainer image चलाकर किया जा सकता है - CLI के अलावा Go के
libpackage के जरिए इसे library के रूप में इस्तेमाल किया जा सकता है, और buffer size, delay queue size, log level, listening host और port आदि को arguments से adjust किया जा सकता है
TCP delay simulation के लिए प्रॉक्सी
- Speedbump Go में लिखा गया TCP प्रॉक्सी है और वैरिएबल नेटवर्क लेटेंसी simulate कर सकता है
- प्रॉक्सी target CLI के
<destination>argument से specify किया जाता है, और formathost:postबताया गया है - default behavior TCP traffic को destination तक proxy करते हुए configured delay जोड़ने का है
इंस्टॉलेशन और चलाने के तरीके
- सबसे आसान इंस्टॉलेशन तरीका हर release के
Assetsमें अपने-आप attached prebuilt binary download करना है - source से build करने के लिए repository clone करने के बाद
go buildचलाएं - container में चलाने के लिए kffl/speedbump image इस्तेमाल की जा सकती है
बेसिक उपयोग का उदाहरण
- पोर्ट
2000पर listen करते हुए और TCP traffic कोlocalhost:80पर proxy करते हुए बेस delay100ms, sine wave amplitude100ms, और period1mलागू किया जा सकता है- यह configuration maximum additional latency
200msऔर minimum additional latency0बनाता है - run example
speedbump --latency=100ms --sine-amplitude=100ms --sine-period=1m --port=2000 localhost:80है
- यह configuration maximum additional latency
- वही configuration container image से भी चलाया जा सकता है
- example
docker run --net=host kffl/speedbump:latest --latency=100ms --sine-amplitude=100ms --sine-period=1m --port=2000 localhost:80है
- example
- sawtooth wave delay component भी configure किया जा सकता है
- example में बेस delay
300ms, sawtooth wave amplitude200ms, period2m, port2000, destinationlocalhost:80configuration है - run command
speedbump --latency=300ms --saw-amplitude=200ms --saw-period=2m --port=2000 localhost:80है
- example में बेस delay
लेटेंसी components का combination
- Speedbump कई लेटेंसी components को एक साथ apply कर सकता है
- README में sawtooth wave और sine wave combine किए गए delay graph का example शामिल है
CLI arguments और library usage
speedbump --helpspeedbump [<flags>] <destination>format में usage देता है- प्रमुख network settings इस प्रकार हैं
--host: listen करने वाला IP या hostname; specify न करने पर सभी network interfaces से bind करता है--port: listening port, default value8000है--buffer: TCP reads के लिए इस्तेमाल होने वाला buffer size, default value64KBहै--queue-size: read buffers store करने वाली delay queue size, default value1024है
- delay-related defaults और waveform options दिए गए हैं
--latency: proxy traffic में जोड़ी जाने वाली बेस लेटेंसी, default value5msहै--sine-amplitude,--sine-period: sine wave latency amplitude और period--saw-amplitude,--saw-period: sawtooth wave latency amplitude और period--square-amplitude,--square-period: square wave latency amplitude और period--triangle-amplitude,--triangle-period: triangle wave latency amplitude और period
- operations-related options भी शामिल हैं
--log-level: log level; possible valuesDEBUG,TRACE,INFO,WARN,ERRORहैं--version: application version दिखाता है
- Speedbump को Go library के रूप में भी इस्तेमाल किया जा सकता है, और यह
libpackage के जरिए उपलब्ध है - license Apache 2.0 License है
1 टिप्पणियां
Hacker News की टिप्पणियां
मैंने अलग-अलग नेटवर्क आकारों और स्थितियों में कई ActivityPub implementations को टेस्ट करने के लिए कुछ ऐसा ही देखा था, लेकिन पता चला कि मेरी मशीन पर
tcके रूप में जरूरत की सारी चीजें पहले से इंस्टॉल थींमेरे distro में यह iproute2 package में शामिल था, और इसका विवरण यहां भी है: https://wiki.archlinux.org/title/advanced_traffic_control
किसी खास interface पर delay जोड़ने के लिए
tc qdisc add dev eth0 root netem delay 100msजैसा command चला सकते हैंइस्तेमाल में आसान है, Docker containers में भी अच्छे से काम करता है, delay, packet loss, duplication जैसी conditions लागू कर सकता है, और संभव है कि आपके पास पहले से इंस्टॉल हो
tc/netem/tbfवाकई शानदार हैं। इनके ऊपर मैंने एक साधारण Python GUI बनाया और उसे touchscreen case में लगे Pi पर चलाया; यह एक छोटा-सा काला box था जिसमें “packet drop: [0%] [1%] [10%] [50%] / packet corruption: ...” जैसी चीजें थीं, और customers काफी प्रभावित हुएहैरानी की बात है कि commercial hardware products के रूप में ऐसे frontend ज्यादा दिखते नहीं; अगर मैंने search में miss नहीं किया, तो शायद market में हैं ही नहीं
tcकी कमी यह है कि इसे incoming packets पर लागू करना थोड़ा अजीब और कठिन हैपहले मैंने एक खास commercial satellite terminal की नकल करने के लिए खुद emulator बनाया था। वह terminal packets को queue में रखता था और किसी threshold पर पहुंचने या timeout होने पर उन्हें एक साथ burst में भेज देता था; साथ ही वह छोटे packets को “मेहरबानी” करके queue के आगे reorder कर delay कम करने की कोशिश करता था, लेकिन TCP stack को यह बिल्कुल पसंद नहीं आया
tcयह नहीं कर पातासमय के साथ बदलते satellite/RF weather effects को simulate करने में यह काफी उपयोगी हो सकता है
Netflix ने जो बनाया था, वह ठीक यही था, और उसका नाम latency monkey था
हमने पाया कि कोई downstream service “slow” है या नहीं, यह तय करना उसके “unavailable” होने का पता लगाने से कहीं ज्यादा कठिन है; इसलिए यह test करने का एक अहम तरीका था कि services slowdown और network issues को कैसे handle करती हैं
implementation बहुत simple था: configurable ratio के हिसाब से packets drop किए जाते थे, जिससे retransmission मजबूर होती थी और दूसरी तरफ packets delayed और out-of-order पहुंचते थे
आखिर में network access से जुड़े error-handling code में बहुत सारी समस्याएं मिलीं
interactive Internet applications बनाने वाले हर software engineer को अपने रोजमर्रा के काम में ऐसे tools जरूर इस्तेमाल करने चाहिए। सिर्फ TCP ही नहीं, QUIC भी चाहिए, और DNS को भी पकड़ना हो तो ideally सभी UDP भी शामिल होने चाहिए
मुझे यकीन है कि अगर बनाने वाले लोग सिर्फ gold-plated Cadillac जैसी computing environment में काम न करते, तो web apps की 90% bloating गायब हो जाती
https://firefox-source-docs.mozilla.org/devtools-user/networ...
बेशक, यह केवल frontend, browser-based testing पर लागू होता है
disaster relief जैसी situations में, जहां network connection रुक-रुक कर टूटता है, कई apps बेहद खराब तरीके से काम करते हैं
अगर और app developers intermittent connectivity simulate करके test करें, तो इससे दूसरों को मदद मिल सकती है
“Toxiproxy is a framework for simulating network conditions” (2021) https://news.ycombinator.com/item?id=29084277#29088775 में यह बात आई थी:
क्योंकि आप केवल 50-byte packets भेज रहे होते हैं और उनमें से हर 10 में 1 packet खो जाता है। इस दौरान server का एक thread कोई उपयोगी काम नहीं कर रहा होता
Mac पर built-in tools से भी यही किया जा सकता है
एक project है जो कुछ समय से inactive है, लेकिन नाम ही बहुत कुछ कह देता है: https://github.com/tylertreat/comcast
हाल ही में Mac पर slow network simulate करने की कोशिश करते हुए मुझे Network Link Conditioner मिला, और यह काफी अच्छा है। proxy जैसी कोई चीज setup करने की जरूरत नहीं
इसे Xcode additional tools से install करना होता है
https://nshipster.com/network-link-conditioner/
Shopify का बेहतरीन tool toxiproxy भी देखने लायक है: https://github.com/Shopify/toxiproxy
networking libraries को खुद implement करके test करने का भी यह बहुत अच्छा तरीका है, क्योंकि stack को ज्यादातर adverse situations को सही से handle कर पाना चाहिए
‘chaos engineering’ का idea शानदार है
मैं web crawler के लिए progress bar develop कर रहा हूं, लेकिन localhost पर test करने पर यह इतना तेज होता है कि problem है या नहीं, समझना मुश्किल होता है
speedbump इस्तेमाल करके बस
podman run --net=host kffl/speedbump:latest --latency=1s --port=8001 localhost:8000चलाना होता है और http://localhost:8001 पर crawler test करना होता हैसाफ-सुथरा tool है
Windows पर मैंने एक similar tool इस्तेमाल किया है
https://jagt.github.io/clumsy/
FreeBSD में भी ipfw के हिस्से के रूप में dummynet है, जिससे delay, bandwidth limits, queue size, और packet loss inject किए जा सकते हैं। यह MacOS में मौजूद feature जैसा ही है
tcजैसा है?