प्रति सेकंड 1.2 मिलियन JSON अनुरोधों को संभालने के लिए Linux को अनुकूलित करना

HTTP अनुरोधों को संसाधित करने के लिए अधिकतम प्रदर्शन प्राप्त करने के लिए लिनक्स वातावरण को ट्यून करने पर एक विस्तृत गाइड प्रकाशित किया गया है। प्रस्तावित विधियों ने अमेज़ॅन ईसी2 वातावरण (4 वीसीपीयू) में लाइब्रेक्टर लाइब्रेरी पर आधारित जेएसओएन प्रोसेसर के प्रदर्शन को प्रति सेकंड 224 हजार एपीआई अनुरोधों से बढ़ाना संभव बना दिया है, जिसमें अमेज़ॅन लिनक्स 2 की मानक सेटिंग्स कर्नेल 4.14 से 1.2 मिलियन अनुरोध प्रति सेकंड है। अनुकूलन के बाद दूसरा (436% की वृद्धि), और इससे प्रसंस्करण अनुरोधों में देरी में 79% की कमी भी आई। प्रस्तावित विधियाँ लाइब्रेक्टर के लिए विशिष्ट नहीं हैं और nginx, Actix, Netty और Node.js सहित अन्य http सर्वरों का उपयोग करते समय काम करती हैं (libreactor का उपयोग परीक्षणों में किया गया था क्योंकि इस पर आधारित समाधान ने बेहतर प्रदर्शन दिखाया था)।

प्रति सेकंड 1.2 मिलियन JSON अनुरोधों को संभालने के लिए Linux को अनुकूलित करना

बुनियादी अनुकूलन:

  • लाइब्रेक्टर कोड का अनुकूलन। टेकेमपावर किट से आर18 विकल्प को आधार के रूप में इस्तेमाल किया गया था, जिसे इस्तेमाल किए गए सीपीयू कोर की संख्या को सीमित करने के लिए कोड को हटाकर सुधार किया गया था (अनुकूलन ने काम को 25-27% तक तेज करने की अनुमति दी थी), जीसीसी में "-ओ3" विकल्पों के साथ संयोजन किया गया था। (5-10% की वृद्धि) और "-मार्च-नेटिव" (5-10%), रीड/राइट कॉल को रिकव/सेंड (5-10%) से बदलना और पीथ्रेड्स का उपयोग करते समय ओवरहेड को कम करना (2-3%) . कोड अनुकूलन के बाद समग्र प्रदर्शन में 55% की वृद्धि हुई, और थ्रूपुट 224k req/s से बढ़कर 347k req/s हो गया।
  • सट्टा निष्पादन कमजोरियों के विरुद्ध सुरक्षा अक्षम करें। कर्नेल को लोड करते समय "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" पैरामीटर का उपयोग करने से प्रदर्शन को 28% तक बढ़ाने की अनुमति मिली, और थ्रूपुट 347k req/s से बढ़कर 446k req/s हो गया। अलग से, पैरामीटर "nospectre_v1" (स्पेक्टर v1 + SWAPGS से सुरक्षा) से वृद्धि 1-2% थी, "nospectre_v2" (स्पेक्टर v2 से सुरक्षा) - 15-20%, "pti=off" (स्पेक्टर v3/मेल्टडाउन) - 6%, "mds=off tsx_async_abort=off" (MDS/Zombieload और TSX एसिंक्रोनस एबॉर्ट) - 6%। L1TF/फोरशैडो (l1tf=फ्लश), iTLB मल्टीहिट, सट्टा स्टोर बायपास और SRBDS हमलों के खिलाफ सुरक्षा के लिए सेटिंग्स को अपरिवर्तित छोड़ दिया गया था, जिससे प्रदर्शन पर कोई प्रभाव नहीं पड़ा क्योंकि वे परीक्षण किए गए कॉन्फ़िगरेशन के साथ प्रतिच्छेद नहीं करते थे (उदाहरण के लिए, KVM के लिए विशिष्ट, नेस्टेड) वर्चुअलाइजेशन और अन्य सीपीयू मॉडल)।
  • "ऑडिटक्टल -ए नेवर,टास्क" कमांड का उपयोग करके ऑडिटिंग और सिस्टम कॉल ब्लॉकिंग तंत्र को अक्षम करना और डॉकर कंटेनर शुरू करते समय "--सुरक्षा-ऑप्ट seccomp=unconfined" विकल्प निर्दिष्ट करना। समग्र प्रदर्शन में 11% की वृद्धि हुई, और थ्रूपुट 446k req/s से बढ़कर 495k req/s हो गया।
  • संबंधित कर्नेल मॉड्यूल को अनलोड करके iptables/netfilter को अक्षम करना। फ़ायरवॉल को अक्षम करने का विचार, जिसका उपयोग किसी विशिष्ट सर्वर समाधान में नहीं किया गया था, प्रोफ़ाइलिंग परिणामों द्वारा प्रेरित किया गया था, जिसके आधार पर nf_hook_slow फ़ंक्शन को निष्पादित होने में 18% समय लगा। यह देखा गया है कि nftables iptables की तुलना में अधिक कुशलता से काम करता है, लेकिन Amazon Linux iptables का उपयोग करना जारी रखता है। iptables को अक्षम करने के बाद, प्रदर्शन में 22% की वृद्धि हुई, और थ्रूपुट 495k req/s से बढ़कर 603k req/s हो गया।
  • प्रोसेसर कैश उपयोग की दक्षता में सुधार के लिए विभिन्न सीपीयू कोर के बीच हैंडलर का कम माइग्रेशन। अनुकूलन को सीपीयू कोर (सीपीयू पिनिंग) के लिए बाइंडिंग लाइब्रेक्टर प्रक्रियाओं के स्तर पर और कर्नेल नेटवर्क हैंडलर (रिसीव साइड स्केलिंग) को पिन करने के माध्यम से किया गया था। उदाहरण के लिए, irqbalance अक्षम कर दिया गया था और CPU के लिए कतार एफ़िनिटी स्पष्ट रूप से /proc/irq/$IRQ/smp_affinity_list में सेट की गई थी। लाइब्रेक्टर प्रक्रिया और आने वाले पैकेटों की नेटवर्क कतार को संसाधित करने के लिए समान सीपीयू कोर का उपयोग करने के लिए, एक कस्टम बीपीएफ हैंडलर का उपयोग किया जाता है, जो सॉकेट बनाते समय SO_ATTACH_REUSEPORT_CBPF ध्वज सेट करके जुड़ा होता है। आउटगोइंग पैकेटों की कतारों को सीपीयू से जोड़ने के लिए, सेटिंग्स /sys/class/net/eth0/queues/tx- को बदल दिया गया है /xps_cpus. समग्र प्रदर्शन में 38% की वृद्धि हुई, और थ्रूपुट 603k req/s से बढ़कर 834k req/s हो गया।
  • व्यवधान प्रबंधन और मतदान के उपयोग का अनुकूलन। ENA ड्राइवर में एडाप्टिव-आरएक्स मोड को सक्षम करने और sysctl net.core.busy_read में हेरफेर करने से प्रदर्शन में 28% की वृद्धि हुई (थ्रूपुट 834k req/s से बढ़कर 1.06M req/s हो गया, और विलंबता 361μs से घटकर 292μs हो गई)।
  • सिस्टम सेवाओं को अक्षम करना जो नेटवर्क स्टैक में अनावश्यक अवरोधन का कारण बनती हैं। dhclient को अक्षम करने और IP पते को मैन्युअल रूप से सेट करने के परिणामस्वरूप प्रदर्शन में 6% की वृद्धि हुई और थ्रूपुट 1.06M req/s से बढ़कर 1.12M req/s हो गया। dhclient प्रदर्शन को प्रभावित करने का कारण कच्चे सॉकेट का उपयोग करके ट्रैफ़िक विश्लेषण करना है।
  • स्पिन लॉक से लड़ना। नेटवर्क स्टैक को sysctl "net.core.default_qdisc=noqueue" और "tc qdisc रिप्लेस dev eth0 रूट mq" के माध्यम से "noqueue" मोड में स्विच करने से प्रदर्शन में 2% की वृद्धि हुई, और थ्रूपुट 1.12M req/s से बढ़कर 1.15M हो गया। अनुरोध/एस.
  • अंतिम छोटे अनुकूलन, जैसे "एथटूल -के एथ0 ग्रो ऑफ" कमांड के साथ जीआरओ (जेनेरिक रिसीव ऑफलोड) को अक्षम करना और sysctl "net.ipv4.tcp_congestion_control=reno" का उपयोग करके क्यूबिक कंजेशन कंट्रोल एल्गोरिदम को रेनो से बदलना। कुल उत्पादकता वृद्धि 4% थी। थ्रूपुट 1.15M req/s से बढ़कर 1.2M req/s हो गया।

काम करने वाले अनुकूलन के अलावा, लेख उन तरीकों पर भी चर्चा करता है जिनसे अपेक्षित प्रदर्शन में वृद्धि नहीं हुई। उदाहरण के लिए, निम्नलिखित अप्रभावी साबित हुआ:

  • लाइब्रेक्टर को अलग से चलाने का प्रदर्शन किसी कंटेनर में चलाने से भिन्न नहीं था। राइटव को सेंड से बदलने, ईपोल_वेट में मैक्सइवेंट बढ़ाने और जीसीसी संस्करणों और झंडों के साथ प्रयोग करने से कोई प्रभाव नहीं पड़ा (प्रभाव केवल "-O3" और "-मार्च-नेटिव" झंडों के लिए ध्यान देने योग्य था)।
  • SCHED_FIFO और SCHED_RR शेड्यूलर्स का उपयोग करके लिनक्स कर्नेल को संस्करण 4.19 और 5.4 में अपग्रेड करना, sysctl कर्नेल.sched_min_granularity_ns, कर्नेल.sched_wakeup_granularity_ns, ट्रांसपेरेंट_ह्यूजपेज = कभी नहीं, skew_tick = 1 और क्लॉकसोर्स = tsc में हेरफेर करने से प्रदर्शन पर कोई असर नहीं पड़ा।
  • ईएनए ड्राइवर में, ऑफलोड मोड (सेगमेंटेशन, स्कैटर-गैदर, आरएक्स/टीएक्स चेकसम) को सक्षम करने, "-O3" ध्वज के साथ निर्माण करने और ena.rx_queue_size और ena.force_large_llq_header पैरामीटर का उपयोग करने से कोई प्रभाव नहीं पड़ा।
  • नेटवर्क स्टैक में परिवर्तन से प्रदर्शन में सुधार नहीं हुआ:
    • IPv6 अक्षम करें: ipv6.disable=1
    • वीएलएएन अक्षम करें: modprobe -rv 8021q
    • पैकेज स्रोत जाँच अक्षम करें
      • Net.ipv4.conf.all.rp_filter=0
      • Net.ipv4.conf.eth0.rp_filter=0
      • Net.ipv4.conf.all.accept_local=1 (नकारात्मक प्रभाव)
    • net.ipv4.tcp_sack = 0
    • Net.ipv4.tcp_dsack=0
    • Net.ipv4.tcp_mem/tcp_wmem/tcp_rmem
    • नेट.कोर.नेटदेव_बजट
    • नेट.कोर.देव_वेट
    • Net.core.netdev_max_backlog
    • Net.ipv4.tcp_slow_start_after_idle=0
    • Net.ipv4.tcp_moderate_rcvbuf=0
    • Net.ipv4.tcp_timestamps=0
    • net.ipv4.tcp_low_latency = 1
    • SO_प्राथमिकता
    • TCP_NODELAY

    स्रोत: opennet.ru

एक टिप्पणी जोड़ें