Linux नेटवर्क परफॉर्मेंस पैरामीटर
(github.com/leandromoreira)- Linux नेटवर्क फ्लो के भीतर अक्सर इस्तेमाल होने वाले sysctl/network parameters कहाँ स्थित होते हैं, यह दिखाने वाला एक छोटा ट्यूटोरियल
- हर स्थिति में एक साथ उच्च throughput और कम latency देने वाले cargo cult values व्यावहारिक नहीं हैं, और नए kernel versions में defaults आमतौर पर अच्छी तरह tuned होते हैं; defaults बदलना परफॉर्मेंस को नुकसान पहुँचा सकता है
- receive path को NIC के MAC/FCS सत्यापन, DMA, receive ring buffer, hard IRQ, NAPI, soft IRQ, ingress qdisc, netfilter, TCP state machine,
tcp_rmemआधारित receive buffer, और application read तक के फ्लो के रूप में व्यवस्थित किया गया है - transmit path को application
sendmsg,skb_buffallocation,tcp_wmemआधारित socket write buffer, TCP/IP header processing, netfilter,txqueuelenआधारित output qdisc, transmit ring buffer, DMA, और NIC transmission complete IRQ तक के फ्लो के रूप में व्यवस्थित किया गया है - मुख्य tuning items burst handling, CPU usage, latency, और drop observation से जुड़े हैं
rx,txring buffer ऐसे queue हैं जो connection burst को बिना drop के प्राप्त करने के लिए होते हैं; इन्हें बढ़ाने पर latency बढ़ सकती हैrx-usecs,tx-usecs,rx-frames,tx-frameshard IRQ होने से पहले की प्रतीक्षा अवधि और frame count को दर्शाते हैं; ये CPU usage और hard IRQ को कम कर सकते हैं और latency की कीमत पर throughput बढ़ा सकते हैंnetdev_budget_usecs,netdev_budget,dev_weight,netdev_max_backlogNAPI polling cycle और ingress qdisc throughput से संबंधित हैंtxqueuelenऔरdefault_qdiscOUTPUT side queue और default queuing discipline से संबंधित हैं
- जाँच, बदलाव और monitoring मुख्य रूप से
ethtool,sysctl,ip,tc, और/procfiles पर आधारित हैं- उदाहरण: ring buffer जाँच
ethtool -g ethX, बदलावethtool -G ethX rx value tx value - उदाहरण:
net.core.netdev_budget_usecsजाँचsysctl net.core.netdev_budget_usecs, बदलावsysctl -w net.core.netdev_budget_usecs value - उदाहरण:
default_qdiscजाँचsysctl net.core.default_qdisc, monitoringtc -s qdisc ls dev ethX
- उदाहरण: ring buffer जाँच
- TCP buffer items में
tcp_rmem,tcp_wmem,tcp_moderate_rcvbufशामिल हैं, औरtcp_moderate_rcvbufसेट होने पर TCP receive buffer size को अपने-आप adjust करने की कोशिश करता है - TCP state और congestion control से जुड़े items के रूप में
net.core.somaxconn,tcp_fin_timeout,tcp_available_congestion_control,tcp_congestion_control,tcp_max_syn_backlog,tcp_syncookies,tcp_slow_start_after_idleको भी साथ में व्यवस्थित किया गया है - Linux के अंदरूनी नेटवर्क tracing को perf से देखा जा सकता है, और उदाहरण कमांड का रूप
perf trace --no-syscalls --event 'net:*' ping globo.com -c1 > /dev/nullहै - testing और monitoring tools के रूप में iperf3, vegeta, netdata, prometheus + grafana + node exporter full dashboard के संयोजन का सुझाव दिया गया है
1 टिप्पणियां
Hacker News की राय
Ubuntu Linux के default में net.ipv4.tcp_rmem करीब 6MB है, जबकि net.core.rmem_max करीब 1MB है, जिससे अजीब स्थिति बनती है
default TCP socket जरूरत पड़ने पर TCP receive window को 6MB तक बढ़ा सकता है, लेकिन user-space app अगर
setsockopt SO_RCVBUFकॉल करे, तो जो socket पहले से 6MB तक जा सकता था वह भी अधिकतम 1MB तक सीमित हो जाता है6MB से 4MB पर घटाने की कोशिश करें तो भी नतीजा 1MB हो जाता है—यह बहुत अजीब लगता है, और यही बात
SO_SNDBUF/wmemपर भी लागू होती हैऐसा लगता है कि Linux इन options की priority को लेकर उलझा हुआ है; समझ नहीं आता कि
core.rmem_maxको बड़ा रखकर उसे authoritative निर्देश क्यों नहीं बनाया जाता, क्या इसके पीछे कोई ऐतिहासिक वजह हैSO_SNDBUF/wmemके बजाय TCP_NOTSENT_LOWAT को कम किया जा सकता हैयह bandwidth-delay product (BDP) के लिए जरूरी मात्रा से ऊपर अतिरिक्त buffer होने वाली मात्रा को सीमित करता है
जैसे ही आप
SO_RCVBUFसेट करते हैं, उस socket में auto tuning हट जाती है, औरnet.core.rmem_maxmaximum बन जाता हैDocumentation/networking/ip-sysctl.rstमें यह काफी साफ तौर पर documented हैयह बेहतरीन है, खासकर इसलिए कि इसमें packet के NIC में आने के बाद user space तक पहुंचने के सभी चरण दिखाए गए हैं
network performance के बारे में एक बात और जोड़नी हो तो, कई CPUs वाले system में बड़े servers में आम NUMA allocation को जरूर check करना चाहिए
अगर network card एक CPU की तरफ है और application दूसरे CPU पर चल रहा है, तो performance पर असर पड़ सकता है
अगर आप network send/receive को सच में सीखना चाहते हैं, तो ये पढ़ने लायक हैं
https://blog.packagecloud.io/monitoring-tuning-linux-network...
https://blog.packagecloud.io/monitoring-tuning-linux-network...
https://packagecloud.io/blog/illustrated-guide-monitoring-tu...
Linux के default congestion control
net.ipv4.tcp_congestion_controlको सिर्फ bbr में बदल देने से भी कुछ स्थितियों में जबरदस्त फर्क पड़ता हैशायद दूरी, बीच-बीच में packet loss और jitter, और encapsulation होने पर यह खास तौर पर सच लगता है
पिछले 1 साल में मैंने
client host <-- HTTP --> reverse proxy host <-- HTTP over Wireguard --> service hostflow की समस्या debug की; औसतन theoretical maximum throughput के 20% से ऊपर जाना मुश्किल था, और समय बीतने पर connection लगभग रुक-सा जाने जितना धीमा हो जाता थाconnection को बार-बार जबरन बंद करने जैसे temporary workaround इस्तेमाल कर रहा था, फिर congestion control को
bbrमें बदलने पर theoretical maximum के करीब throughput और stable connection मिला, और यह बदलाव Wireguard के दोनों सिरों पर जरूरी थाज्यादातर TCP stacks पहली बार loss दिखते ही sending window को आधा या काफी कम कर देते हैं, इसलिए अगर VPN में loss है, या 10Mb/s VPN uplink पर 1Gb/s से बड़ा burst भेजा जाए, तो TCP loss देखकर बहुत पीछे हट जाता है
BBR bottleneck bandwidth खोजने की कोशिश करता है; यह round-trip time मापता है और RTT बढ़ने तक transmission rate बढ़ाता है
RTT बढ़ने पर यह मानता है कि path के सबसे संकरे हिस्से में queue जमा हो रही है, फिर queue खाली होकर RTT normal होने तक transmission rate घटाता है, कुछ समय तक उसी speed से भेजता है, और फिर थोड़ा बढ़ाकर फिर से देखता है
कुछ साल पहले 10Mb/s cable uplink से 1Gb/s symmetric fiber line पर जाने के बावजूद company VPN upload करीब 5Mb/s पर ही अटका रहा और यह खीझ पैदा कर रहा था; FreeBSD में RACK TCP या BBR पर बदलने से यह VPN limit के करीब, यानी लगभग 40Mb/s तक, करीब 8 गुना बढ़ गया
किसी एक जादुई value को सेट कर देने से सब बेहतर हो जाएगा—ऐसी copy-paste cargo-cult performance tuning मूल लेख जो कहना चाहता है उसके ठीक उलट है
अच्छी बात है कि Google BBRv3 को upstream कर रहा है, इसलिए जल्द ही स्थिति बेहतर होगी
अगर आप सिर्फ एक direction की performance सुधारना चाहते हैं, तो Wireguard के दोनों ends बदलना जरूरी नहीं है
BBRv1 को लेकर मैं बाकी comments से सहमत हूं, और Linux kernel का cubic implementation ज्यादातर applications में काफी अच्छा काम करता है
सोच रहा हूँ कि Wi‑Fi adapters पर भी performance tuning का मतलब बनता है या नहीं
desktop पर सिर्फ features बंद करने के अलावा i210 और i225 Ethernet issues को ठीक करने का कोई तरीका है या नहीं, यह भी जानना चाहता हूँ
आजकल सबसे common NIC शायद ये दोनों ही लगते हैं, लेकिन common network hardware और drivers में इतनी खामियाँ क्यों हैं, यह समझ नहीं आता
RISC-V में मेरी काफ़ी रुचि है, लेकिन क्या पूरी तरह open और सही NIC से शुरुआत करना बेहतर नहीं होगा?
अगर वह i210 से सस्ता हुआ तो आखिरकार लोग उसे शामिल करेंगे, हालांकि शायद यह असंभव भी हो सकता है
हालांकि Wi‑Fi में random ping spikes फिर भी होते रहते हैं
https://forum.openwrt.org/t/aql-and-the-ath10k-is-lovely/590... पर AQM enable करने और tuning, throughput व latency के बीच trade-off पर एक बड़ा thread है
उसी दौर के CPU पर 1Gb कोई बहुत मुश्किल स्तर भी नहीं है, और i210 4 queues देता है
i210 को लेकर शिकायत क्या है, यह जानना चाहूँगा
चित्रों में समझाया गया Linux network queues का overview इतना अच्छा है कि मन करता है इसे कहीं दीवार पर चिपका दूँ
Brendan की Systems Performance किताब भी Linux network performance आदि को अच्छे से cover करती है, और इसका 2nd edition भी आ चुका है
दोनों editions बेहतरीन हैं, लेकिन 2nd edition मुख्य रूप से Linux पर focus करता है, जबकि 1st edition में Solaris भी शामिल है
हाल में उसी author की BPF Performance Tools किताब भी आई है
[1] Systems Performance: Enterprise and the Cloud, 2nd Edition (2020)
https://www.brendangregg.com/systems-performance-2nd-edition...
[2] BPF Performance Tools:
https://www.brendangregg.com/bpf-performance-tools-book.html
लेख को सरसरी तौर पर पढ़ना भी मज़ेदार था, और research व structure बहुत अच्छे थे
हालांकि सोचता हूँ कि Linux network parameters को नियमित रूप से tune करने वाले लोग असल में कौन हैं
इस document में कहीं साफ़ तौर पर TCP लिखना चाहिए लगता है
content बहुत ज़्यादा TCP-related concerns पर केंद्रित है, और लोग मुख्य रूप से TCP इस्तेमाल करते हैं, इसलिए यह उपयोगी तो है
लेकिन default UDP tuning values बेहद कम हैं, और वह हिस्सा साफ़ तौर पर missing है
इसी तरह की चीज़ों को cover करने वाले videos या series की recommendation चाहिए
सामान्य networking resources बहुत हैं, लेकिन Linux के specific implementation को cover करने वाली सामग्री ढूँढना मुश्किल रहा
microcontroller के लिए एक simple TCP echo server बनाकर देखना चाहता हूँ, लेकिन ज़्यादातर examples सिर्फ vendor की अपनी TCP library इस्तेमाल करते हैं और router से सीधे connection setup और establish करने की process लगभग समझाते ही नहीं