Linux नेटवर्क प्रदर्शन की अंतिम गाइड
(ntk148v.github.io)- Linux नेटवर्क performance tuning का मतलब packet के NIC ring buffer, IRQ, NAPI, softIRQ, qdisc, TCP buffer से होकर application socket तक जाने वाले flow को bottleneck के हिसाब से समझना है
- receive path में NIC DMA के ज़रिए packet को RAM में लिखता है और HardIRQ generate करता है; driver NAPI को schedule करता है ताकि
NET_RX_SOFTIRQमें ring buffer खाली करने के बाद उसे IP/TCP layer और socket receive buffer तक भेजा जा सके ethtool,/proc/net/softnet_stat,ss,netstat,sysctlobservation और tuning के शुरुआती tools हैं; interrupt coalescing, IRQ affinity, RSS/RPS/RFS/aRFS,netdev_budget,netdev_max_backlog,txqueuelen, TCP read/write buffers मुख्य tuning axes हैं- सभी systems पर लागू होने वाली कोई single setting नहीं है; ring buffer बढ़ाने से drops कम हो सकते हैं लेकिन latency बढ़ सकती है, और interrupt coalescing CPU usage व HardIRQ को घटाता है लेकिन latency cost ला सकता है
- high-performance packet processing
PACKET_MMAP, DPDK,PF_RING, XDP/AF_XDP जैसे options तक expand होती है, लेकिन kernel bypass, zero-copy और in-kernel fast path—हर तरीके में hardware dependency, CPU occupancy और kernel version requirements अलग होते हैं
Linux receive path: NIC से socket तक
- network device packet arrival बताने के लिए IRQ generate करता है, और Linux की IRQ mapping
/proc/interruptsमें stored होती है - IRQ handler बहुत high priority पर चलता है और कभी-कभी additional IRQ generation को रोकता है, इसलिए driver लंबे कामों को IRQ context के बाहर defer करता है
- इस deferred processing में softIRQ इस्तेमाल होता है, और network receive processing में हर CPU के लिए
ksoftirqd/<cpu-number>kernel thread,softnet_data,poll_listबनाए जाते हैं net_dev_initNET_RX_SOFTIRQको softIRQ system में register करता है, और उसका handlernet_rx_actionहोता है-
packet arrival और NAPI processing
- NIC network से मिले data को DMA के ज़रिए RAM के ring buffer में लिखता है
- कुछ NIC कई ring buffers वाले multiqueue NIC होते हैं
- जब NIC HardIRQ generate करता है, तो driver का IRQ handler चलता है
- driver NIC का IRQ clear करता है और
napi_schedulecall करके NAPI softIRQ poll loop शुरू करता है napi_scheduledriver के NAPI poll structure को current CPU कीpoll_listमें जोड़ता है और softIRQ pending bit set करता है- जब
ksoftirqd__do_softirqcall करता है, तो pendingNET_RX_SOFTIRQका handlernet_rx_actionexecute होता है
-
GRO और protocol stack में entry
net_rx_actionNAPI poll list check करता है, औरbudgetव elapsed time को जांचता है ताकि softIRQ CPU को monopolize न करे- driver का
pollfunction RAM के ring buffer से packets harvest करता है - packets
napi_gro_receiveको दिए जाते हैं - GRO(Generic Receive Offloading) software-based offloading technique है, जो छोटे packets को बड़े packets में reassemble करके application को process करने वाले packets की संख्या घटाती है
- अगर GRO packet को hold नहीं करता, तो वह
netif_receive_skbके ज़रिए protocol stack में ऊपर जाता है
-
RPS enabled है या नहीं, उसके आधार पर branch
- जब RPS disabled हो:
netif_receive_skbdata को__netif_receive_coreतक भेजता है__netif_receive_coredata को tap और registered protocol layer handlers तक भेजता है
- जब RPS enabled हो:
netif_receive_skbdata कोenqueue_to_backlogतक भेजता है- packet per-CPU input queue में जाता है
- remote CPU का NAPI structure उस CPU की
poll_listमें जोड़ा जाता है, और IPI queue होता है जो remote CPU के softIRQ thread को जगाता है - remote CPU का
ksoftirqdprocess_backlogpoll function के ज़रिए CPU input queue से packets harvest करता है
- जब RPS disabled हो:
-
IP, TCP, socket receive buffer
- packet IPv4 layer में
ip_rcvसे receive होता है और netfilter व routing optimization से गुजरता है - current system के लिए destined data UDP या TCP जैसे upper protocol layers को भेजा जाता है
- TCP receive path में
tcp_v4_rcv, TCP finite state machine और socket lookup के बाद data receive buffer में जाता है - receive buffer size
tcp_rmemrules follow करता है - अगर
tcp_moderate_rcvbufenabled हो, तो kernel receive buffer को automatically tune करता है tcp_rmemमें TCP socket receive buffer के minimum, default और maximum values होती हैंSO_RCVBUFइस्तेमाल करने पर उस socket के receive buffer की automatic tuning disabled हो जाती हैnet.core.rmem_maxTCP receive buffer size की upper limit है; larger window ACK भेजने से पहले ज्यादा data transmit करवाकर latency घटा सकती है और throughput बढ़ा सकती है
- packet IPv4 layer में
Linux transmit path: application से NIC तक
- transmit path receive से सरल है, लेकिन qdisc, TCP write buffer, DMA और IRQ इसमें शामिल होते हैं
- जब application
sendmsgजैसी call से message भेजती है, तो TCP transmit pathskb_buffallocate करता है - packet
tcp_wmemsize के socket write buffer में जाता हैtcp_wmemमें TCP socket transmit buffer के minimum, default और maximum values होती हैं- kernel TCP transmit buffer size को minimum और maximum के बीच dynamically tune करता है
SO_SNDBUFइस्तेमाल करने पर उस socket के transmit buffer की automatic tuning disabled हो जाती हैnet.core.wmem_maxTCP transmit buffer size की upper limit है
- TCP header और IP header बनाए जाते हैं, फिर
LOCAL_OUT, routing,POST_ROUTING, fragmentation से गुजरने के बादdev_queue_xmitसे L2 transmit function call होता है - output qdisc
txqueuelenlength औरdefault_qdiscalgorithm का इस्तेमाल करता है - driver packet को TX ring buffer में डालता है, और
tx-usecstimeout याtx-framesके बादNET_TX_SOFTIRQperform करता है - NIC DMA के ज़रिए RAM से packet लाकर transmit करता है, और transmit complete होने के बाद HardIRQ generate करता है
- driver इस IRQ को process करता है और RAM free करने के लिए NAPI poll system को schedule करता है
अवलोकन टूल और बुनियादी जाँच बिंदु
-
/proc/net/softnet_stat/proc/net/softnet_statकी हर लाइन एक CPU कोर को दर्शाती है और CPU0 से शुरू होती है- हर कॉलम के आँकड़े hexadecimal में दिए जाते हैं
- पहला कॉलम interrupt handler द्वारा प्राप्त frames की संख्या है
- दूसरा कॉलम
netdev_max_backlogसे अधिक होने के कारण drop हुए frames की संख्या है - तीसरा कॉलम उन बारों की संख्या है जब प्रोसेस करने का काम बाकी था, लेकिन
ksoftirqdनेnetdev_budgetया CPU समय खत्म कर दिया - बाकी कॉलम Linux version के अनुसार बदल सकते हैं
-
/proc/net/sockstatऔरss/proc/net/sockstatमेंmemfield देखें- यह मान सभी sockets के
sk_buff->truesizeको जोड़कर निकाला जाता है sssocket statistics dump करने का टूल है, औरnetstatजैसी जानकारी के साथ अधिक TCP और state जानकारी दिखा सकता हैss -tmका उपयोग TCP sockets की memory usage जाँचने के लिए किया जाता हैrmem_alloc: received packets के लिए allocated memoryrcv_buf: received packets के लिए allocate की जा सकने वाली कुल memorywmem_alloc: layer 3 को पहले ही भेजे जा चुके outgoing packets में उपयोग हुई memorysnd_buf: outgoing packets के लिए allocate की जा सकने वाली कुल memorywmem_queued: अभी layer 3 को नहीं भेजे गए outgoing packets के लिए allocated memorysock_drop: socket तक demultiplex होने से पहले drop हुए packets की संख्या
-
netstatऔरsysctlnetstatएक command-line tool है जो open network connections और protocol stack statistics output करता है, और/proc/net/file system से जानकारी लाता है/proc/net/dev: device information/proc/net/tcp: TCP socket information/proc/net/unix: Unix domain socket informationsysctl,/procfile system में सीधे values लिखने के बजाय system और network settings बदलने की command हैsysctl -w variable=valuetemporary changes के लिए उपयोग करें, और permanent changes के लिए/etc/sysctl.confको modify करने के बादsysctl -pसे apply करें
NIC ring buffer और interrupt tuning
-
NIC ring buffer
- RX ring buffer RAM में स्थित fixed-size FIFO circular buffer है
- ring buffer खुद packet data नहीं रखता, बल्कि DMA के जरिए RAM में आए
skbकी ओर इशारा करने वाले descriptors रखता है - अगर drops या overrun दिखें तो queue size बढ़ाया जा सकता है, लेकिन side effect के तौर पर latency बढ़ सकती है
- कई मामलों में receive buffer size बढ़ाने मात्र से packet drops रोके जा सकते हैं, और kernel को buffer खाली करने के लिए थोड़ा और समय मिल जाता है
- जाँच और बदलाव
ethtoolसे किए जाते हैं ethtool -g eth3: मौजूदा RX/TX ring size और maximum value देखेंethtool -G eth3 rx 8192 tx 8192: RX/TX buffers को maximum value तक बढ़ाएँethtool -S eth3औरerr,drop,over,miss,timeout,reset,collisजैसे counters से monitor करें
-
hardware interrupt coalescing
- NIC,
rx-usecstimeout याrx-framescondition तक RX ring buffer में packet references जमा करने के बाद HardIRQ generate कर सकता है; इसे Interrupt coalescence कहा जाता है - बहुत जल्दी interrupts होने पर kernel के चल रहे काम बार-बार रुकते हैं, जिससे system performance खराब होती है
- बहुत देर से interrupts होने पर NIC traffic को पर्याप्त तेजी से खाली नहीं कर पाता, जिससे overwrite और traffic loss हो सकता है
- interrupt coalescing tuning CPU usage और HardIRQ को घटाकर throughput बढ़ा सकती है, लेकिन latency cost आ सकती है
ethtool -c eth3से coalesce parameters देखें, औरethtool -C eth3 adaptive-rx off rx-usecs 0 rx-frames 0की तरह बदल सकते हैं- adaptive mode में card traffic pattern और kernel receive pattern देखकर coalescing settings को dynamically estimate करता है
- NIC,
IRQ affinity और CPUs के बीच load balancing
-
IRQ affinity
- IRQ में
smp_affinityproperty होती है, जो उन CPU cores को define करती है जो उस IRQ का ISR चला सकते हैं - interrupt affinity और application thread affinity को किसी खास CPU core से match करने पर cache line sharing के कारण application performance बेहतर हो सकती है
- default रूप से इसे
irqbalancedaemon control करता है - manual tuning से पहले
irqbalanceको रोकना चाहिए /proc/irq/<IRQ_NUMBER>/smp_affinityमें CPU cores को दर्शाने वाला hexadecimal bitmask store होता है- 4-core server में default value
fका मतलब है कि सभी CPUs IRQ process कर सकते हैं echo 1 > /proc/irq/32/smp_affinityकेवल CPU0 का उपयोग कराता है- 32 cores से अधिक वाले systems में comma से 32-bit groups अलग किए जाते हैं
- IRQ affinity केवल बहुत specific configurations और पहले से defined workloads में ही performance बढ़ा सकती है, और दो धार वाली तलवार हो सकती है
- IRQ में
-
RSS
- तेज NIC पर single queue और single CPU से ही packets receive करने पर एक core data processing की पूरी जिम्मेदारी उठा सकता है और बाकी cores idle रह सकते हैं
- RSS(Receive-side scaling) एक NIC technology है, जिससे NIC traffic को कई receive/transmit queues में distribute करता है
- NIC source/destination IP और TCP/UDP source/destination port के आधार पर hash calculate करता है, एक ही flow के packets को एक single queue में assign करता है, और flows को queues में समान रूप से distribute करता है
- RSS multiprocessing environment में parallel receive processing का लाभ देता है
- Linux kernel documentation के अनुसार, RSS को तब enable करना चाहिए जब latency महत्वपूर्ण हो या receive interrupt processing bottleneck हो; low-latency networking में system CPU count के बराबर queues allocate करने वाली setting optimal होती है
-
RPS, RFS, aRFS
- RPS(Receive Packet Steering) RSS के software implementation के करीब है
- जहाँ RSS hardware interrupt handler चलाने के लिए queue और CPU चुनता है, वहीं RPS interrupt handler के ऊपर protocol processing करने वाला CPU चुनता है
CONFIG_RPSजरूरी है और SMP में default रूप से enabled होता है- configuration
/sys/class/net/<dev>/queues/rx-<n>/rps_cpusके CPU bitmap से किया जाता है - अगर RSS मौजूद है तो यह अनावश्यक हो सकता है, लेकिन CPU count queue count से अधिक हो तो उपयोगी हो सकता है
- RFS(Receive Flow Steering) RPS को application locality तक extend करता है
- RPS flow-based तरीके से packets distribute करता है, लेकिन user-space application किस CPU पर चल रही है, इसे consider नहीं करता
- RFS global flow-to-CPU table
rps_sock_flow_tablemaintain करता है net.core.rps_sock_flow_entriesसे table size tune किया जा सकता है- per-queue
rps_dev_flow_tableका उपयोग scheduler द्वारा application को नए CPU पर move करने पर बचे हुए packets के कारण order बिगड़ने की समस्या घटाने के लिए किया जाता है - aRFS(Accelerated RFS) RFS के लिए hardware-accelerated load balancing mechanism है
- यह packets को data consume करने वाले thread के पास वाले CPU पर सीधे भेजता है, इसलिए RFS से बेहतर performance दे सकता है
- NIC का
ndo_rx_flow_steer,ntuplefiltering,CONFIG_RFS_ACCELजरूरी है - CPU और queue की mapping हर receive queue की IRQ affinity से automatically derived होती है, इसलिए extra configuration की जरूरत नहीं होती
softIRQ, qdisc, TCP buffer tuning
-
softIRQ budget
- NAPI polling routine को
netdev_budget_usecs,netdev_budget,dev_weightसे सीमित किया जाता है ताकि softIRQ CPU पर पूरी तरह कब्ज़ा न कर ले net.core.netdev_budgetका default value 300 है, जिसका मतलब है कि softIRQ process के CPU से हटने से पहले NIC से 300 messages खाली किए जाते हैंnet.core.netdev_budget_usecsएक NAPI polling cycle के अधिकतम microseconds की संख्या हैnet.core.dev_weightNAPI interrupt में kernel द्वारा process किए जा सकने वाले प्रति-CPU अधिकतम packets की संख्या है/proc/net/softnet_statमें पहले column के अलावा दूसरे columns बढ़ें तो budget बदलने की ज़रूरत हो सकती है, हालांकि छोटी बढ़ोतरी सामान्य हो सकती है
- NAPI polling routine को
-
ingress qdisc और
netdev_max_backlognetdev_max_backlogkernel की internal queue है जहां NIC से receive होने के बाद IP/TCP जैसे protocol stack processing से पहले traffic रखा जाता है- हर CPU core के लिए एक backlog queue होती है
- अगर interface kernel की processing speed से तेज़ packets receive करता है, तो INPUT-side queue
netdev_max_backlogतक भर जाती है, और उससे अधिक होने पर packets drop हो जाते हैं - default value 1000 है, जो कई 1Gbps interfaces या एक 10Gbps interface के लिए कम पड़ सकती है
/proc/net/softnet_statका दूसरा column backlog queue overflow से बढ़ने वाला counter है- value बदलने के लिए
sysctl -w net.core.netdev_max_backlog <value>का उपयोग करें
-
egress qdisc,
txqueuelen,default_qdisctxqueuelennetwork interface device की kernel transmit queue में अनुमति दिए गए packets की संख्या set करता है- default value interface driver के अनुसार 1000 हो सकती है
- इसे
ifconfig <interface> txqueuelen valueसे बदलें, औरip -s linkमें RX/TX dropped जांचें default_qdiscnetwork device पर उपयोग होने वाली default queuing discipline हैpfifo_fastकी जगहsfq,codel,fq_codelजैसे विकल्प specify किए जा सकते हैंtc -s qdisc ls dev <interface>में dropped, overlimits, requeues जैसे metrics देखें
-
TCP read/write buffer और connection queues
tcp_rmemऔरtcp_wmemक्रमशः TCP receive और send buffers के minimum, default, maximum values define करते हैं- बदलाव इस तरह करें
sysctl -w net.ipv4.tcp_rmem="min default max"sysctl -w net.ipv4.tcp_wmem="min default max"
- buffer usage status देखने के लिए
/proc/net/sockstatका उपयोग करें - Accept queue और SYN queue
net.core.somaxconnऔरnet.ipv4.tcp_max_syn_backlogसे प्रभावित होती हैं net.core.somaxconnlisten()के backlog parameter की upper limit है, और इस value को बदलने पर application को भी compatible value पर बदलना होगाnet.ipv4.tcp_syncookiesSYN flood attack protection के लिए उपयोगी SYN cookie को on या off करता हैnet.ipv4.tcp_congestion_controlनई connections के लिए इस्तेमाल होने वाला congestion control algorithm set करता है
NUMA और network performance
- NUMA(Non-uniform memory access) ऐसी memory architecture है जिसमें processor local memory को non-local memory की तुलना में तेज़ access कर सकता है
- network processing में CPU को ring buffer memory access करनी होती है, इसलिए NUMA locality network performance को प्रभावित कर सकती है
- NUMA CPU, memory और devices को कई nodes में बांटता है, और तेज़ interconnect तथा common OS वाले कई छोटे computers की तरह काम करता है
- NUMA systems में tuning का लक्ष्य device के interrupts को उसी single node के CPU cores पर collect करना होता है जिससे वह device संबंधित है
- हालांकि NUMA systems real-time applications के साथ ठीक से interact नहीं कर सकते और अप्रत्याशित event delays पैदा कर सकते हैं
- NUMA node को
/sys/devices/system/node/node*से जांचें - device locality को
/sys/class/net/<interface>/device/numa_nodeसे जांचें-1का मतलब है कि hardware platform वास्तविक NUMA नहीं है, या kernel NUMA का अनुकरण कर रहा है, या device में NUMA locality नहीं है
- Linux kernel 2.5 से NUMA support करता है, और RedHat व Debian-based distributions
numactl,numadprovide करते हैं numadsystem topology और resource usage monitor करता है, और पर्याप्त बड़ी memory तथा CPU load वाले processes को efficient NUMA locality में place करने की कोशिश करता है
तेज़ पैकेट प्रोसेसिंग के विकल्प
-
AF_PACKETv4 औरPACKET_MMAPAF_PACKET v4Linux का तेज़ packet interface है, जो data path में system call हटाता है और मूल रूप से copy-mode का उपयोग करता हैPACKET_ZEROCOPYका उपयोग करने पर DMA packet buffer को user space में map करने वाला true zero-copy mode इस्तेमाल किया जा सकता है- सामान्य file read के बाद socket send path में user mode और kernel mode के बीच context switch और कई बार data copy की ज़रूरत होती है
- zero-copy redundant data copy हटाकर performance बढ़ाता है
PACKET_MMAPतेज़ packet sniffing के लिए Linux API है- यह user space और kernel द्वारा साझा किया गया mmapped ring buffer देता है
- send/receive packets में system call और user space·kernel के बीच copy को कम करता है
-
DPDK
- DPDK(Data Plane Development Kit) तेज़ packet processing के लिए user-space libraries और driver framework है
- इसका लक्ष्य NIC और user application के बीच network packets को native speed पर भेजना-प्राप्त करना है
- इसका target 10Gb या 40Gb NIC हैं, और speed सबसे महत्वपूर्ण मानदंड है
- यह network stack नहीं, बल्कि packet forwarding पर focus करता है
- जब DPDK NIC को control करता है, तो सारा traffic kernel को bypass करता है, और वह NIC kernel में दिखाई नहीं देता
- port को Linux kernel driver से unbind किया जाता है और
vfio_pci,igb_uio,uio_pci_genericजैसे drivers से manage किया जाता है - इसके बाद application और NIC के बीच communication DPDK PMD संभालता है
- बड़े memory chunk allocate करने के लिए DPDK में hugepages configuration की ज़रूरत होती है
- मुख्य components:
- EAL: environment differences को छिपाने वाला generic interface
librte_ring: lockless multi-producer, multi-consumer FIFO APIlibrte_mempool: memory object pool allocationlibrte_mbuf: network packets रखने वाले buffers बनाना·modify करनाlibrte_timer: asynchronous function execution के लिए timer service- PMD: ऐसा driver जिसमें interrupt के बजाय CPU लगातार NIC को poll करता है
- limitations:
- hardware dependency अधिक है
- PMD चलाने के लिए CPU core dedicated allocate करना पड़ता है और यह 100% CPU उपयोग करता है
-
PF_RINGPF_RINGएक Linux kernel module और user-space framework है, जो high speed पर packets process करता है और packet-processing applications को consistent API देता हैPF_RINGLinux NAPI से NIC पर packets poll करता है- NAPI NIC से
PF_RINGcircular buffer में packets copy करता है, और user-space application ring से packets पढ़ता है - इस structure में application और NAPI नाम के दो poller होते हैं, इसलिए CPU cycles polling में खर्च होते हैं
- फायदा यह है कि incoming packets को एक साथ कई rings में distribute किया जा सकता है
- modular structure के कारण ZC module, FPGA-based card module, Stack module, Timeline module, Sysdig module जैसे additional components इस्तेमाल किए जा सकते हैं
PF_RINGने packet capture और userland forwarding की cost घटाई है, लेकिन kernel द्वारा NIC से ring में copy करने और userland द्वारा ring से पढ़कर process करने वाली two-actor structure के कारण optimal performance की एक सीमा हैPF_RING7.5 सेAF_XDPadapter support शामिल करता है
-
XDP और
AF_XDP- XDP(eXpress Data Path) Linux network data path में packets को शुरुआती चरण में intercept करने वाली eBPF implementation है
- XDP, SKB allocation से पहले, device driver RX function के अंदर RX packet page को directly process करता है
- eBPF kernel में चलने वाला user-defined sandboxed bytecode है
- यह 11 64-bit registers और 512-byte stack का उपयोग करता है
- LLVM backend से C, Lua, Go, P4, Rust आदि से eBPF में compile किया जा सकता है
- यह in-kernel verifier और JIT compiler देता है, और map, tail call, helper जैसी सुविधाएँ support करता है
- XDP use cases:
- DoS mitigation के लिए pre-stack filtering
- forwarding और load balancing
- GRO जैसी batching techniques
- flow sampling और monitoring
- ULP processing
- XDP kernel bypass नहीं है, बल्कि kernel stack के अंदर fast path है, और TCP/IP stack को replace नहीं करता
- dedicated hardware की ज़रूरत नहीं है, लेकिन multi-queue NIC, TX/RX checksum offload, RSS, TSO जैसी requirements होती हैं
- DPDK की तुलना में XDP के फायदे:
- busy polling या interrupt driven networking में से चुना जा सकता है
- huge pages की ज़रूरत नहीं होती
- special hardware requirements नहीं हैं
- dedicated CPU अनिवार्य नहीं है
- 3rd party userspace application से packets को kernel में फिर से inject करने की ज़रूरत नहीं होती
- network hardware access के लिए नए security model की ज़रूरत नहीं होती
- 3rd party code/licensing की ज़रूरत नहीं होती
AF_XDPLinux 4.18 में पेश किया गया नया socket type है- kernel को पूरी तरह bypass किए बिना kernel functions का उपयोग करके DPDK या
AF_PACKETजैसी structure बनाई जा सकती है - XDP program eBPF से frame को user-space memory buffer में redirect कर सकता है
- DMA transfer user-space memory का उपयोग करके zero-copy support करता है
AF_PACKETकी तुलना में 3~20 गुना performance improvement हासिल किया जा सकता है- limitations:
- यह अपेक्षाकृत नया project है
- पूरी support के लिए Linux kernel 5.4 या उससे ऊपर की ज़रूरत होती है
1 टिप्पणियां
Hacker News की राय
अगर यह सामग्री कुछ हफ्ते पहले देख ली होती, तो शायद बहुत काम आती
डेटा सेंटरों के बीच L2 लिंक एन्क्रिप्शन करने के लिए कई vendors से hardware appliance के quotes लिए थे, लेकिन लागत बहुत ज्यादा लगी, इसलिए खुद बनाकर देखा
सामान्य-purpose hardware पर WireGuard overlay network के ऊपर Ethernet frames चलाकर 10Gbps देने जैसा setup बनाया, और करीब दस दिन के काम के बाद सबसे सस्ते प्रस्ताव से लगभग 70% और सबसे महंगे प्रस्ताव से लगभग 95% सस्ते में लागू कर लिया, लेकिन इसके लिए काफी बारीक documentation पढ़ना और experiments करने पड़े
इस लेख की सामग्री से मैं अपनी समझ सही है या नहीं validate करना चाहता हूं, और पहली नजर में यह promising और comprehensive लगता है
अगर tune किए जा सकने वाले values इतने ज्यादा हैं, तो लगता है auto-tuning software बनाने लायक बात हो सकती है
whitelist में मौजूद parameters में से random चुनकर allowed range के भीतर थोड़ा ऊपर या नीचे करना, कुछ समय तक performance मापना, फिर खराब हो तो rollback और बेहतर हो तो और adjust करना—gradient descent जैसी approach संभव लगती है
दिलचस्प तो है, लेकिन software engineer के तौर पर लेख में दिए commands को सच में चलाने का मौका बहुत कम मिलता है
systems ज्यादातर किसी Linux के slimmed-down container में चलते हैं, production systems में shell access नहीं होता, और development या QA environments load वगैरह के मामले में production से इतने अलग होते हैं कि bug reproduce करना आम तौर पर ज्यादा मददगार नहीं होता
आखिरकार लेख के commands आजमाने का मौका अपने personal system से छेड़छाड़ करते समय ही मिलता है, और अगर platform engineer के रूप में काम करते हों तो यह उपयोगी लगेगा
Kubernetes में जो चीजें मुझे खास पसंद नहीं हैं, उनमें से एक इसका networking model है। यह मानकर चलता है कि केवल एक network card है, और applications इतनी simple हैं कि उन्हें उसके नीचे की layers की जानकारी की जरूरत नहीं
पूरा networking model simplification और सुधार के लिए 2020s-style में बड़े बदलाव की गुंजाइश रखता दिखता है
net.core.wmem_maxको TCP send buffer size की upper limit बताया गया है, औरnet.ipv4.tcp_wmemभी है, इसलिए दो बातें जाननी हैंnet.core.wmem_maxसे इसका अंतर क्या हैnet.core.wmem_maxनाम के मुताबिक maximum value हैnet.ipv4.tcp_wmemतीन values वाला tuple है—minimum, default, maximum—और इसमें specified maximum पहले वालेnet.core.wmem_maxसे अधिक नहीं हो सकताTCP एक ऐसा protocol होना चाहिए जो IPv4 पर carry हो या IPv6 पर, समान रहता है
उदाहरण: https://docs.redhat.com/en/documentation/red_hat_data_grid/7...
यहां जो थोड़ा छूट गया है, वह 100Gbps से अधिक throughput की debugging और tuning है
उस scale पर HTTP serve करते समय आम तौर पर पहला bottleneck memory bandwidth होता है, इसलिए अक्सर kTLS की जरूरत पड़ती है
AMD μProf जैसे tools debugging में बहुत उपयोगी होते हैं, और kernel व user space में ठीक-ठीक क्या हो रहा है यह समझने के लिए eBPF-based continuous profiling भी मददगार होती है
काफी शानदार लगता है। अब तक मेरे career में जब भी performance की जरूरत पड़ी, आम तौर पर शुरुआत kernel bypass से ही की