1.2 ملين JSON درخواستون في سيڪنڊ کي سنڀالڻ لاءِ لينڪس کي بهتر ڪرڻ

لينڪس ماحول کي ترتيب ڏيڻ تي هڪ تفصيلي گائيڊ شايع ڪيو ويو آهي HTTP درخواستن جي پروسيسنگ لاءِ وڌ کان وڌ ڪارڪردگي حاصل ڪرڻ لاءِ. تجويز ڪيل طريقن ان کي ممڪن بڻايو JSON پروسيسر جي ڪارڪردگي کي وڌائڻ لاءِ ايمازون EC2 ماحول ۾ لائبرري لائبريري جي بنياد تي (4 vCPU) 224 هزار API درخواستن کان في سيڪنڊ Amazon Linux 2 جي معياري سيٽنگن سان kernel 4.14 کان 1.2 ملين درخواستن سان. ٻي اصلاح کان پوءِ (436٪ جو اضافو)، ۽ پڻ 79٪ پاران پروسيسنگ درخواستن ۾ دير ۾ گهٽتائي جو سبب بڻيو. تجويز ڪيل طريقا ليبريڪٽر ۽ ڪم ڪرڻ لاءِ مخصوص نه آهن جڏهن ٻيا http سرور استعمال ڪن ٿا، بشمول nginx، Actix، Netty ۽ Node.js (لائبريڪٽر ٽيسٽ ۾ استعمال ڪيو ويو ڇاڪاڻ ته ان تي ٻڌل حل بهتر ڪارڪردگي ڏيکاري ٿو).

1.2 ملين JSON درخواستون في سيڪنڊ کي سنڀالڻ لاءِ لينڪس کي بهتر ڪرڻ

بنيادي اصلاحون:

  • ليبريڪٽر ڪوڊ کي بهتر ڪرڻ. ٽيڪم پاور کٽ مان R18 آپشن هڪ بنياد طور استعمال ڪيو ويو، جيڪو ڪوڊ کي هٽائڻ سان بهتر ڪيو ويو ته جيئن استعمال ٿيل سي پي يو ڪور جي تعداد کي محدود ڪيو وڃي (اصلاح جي اجازت ڏني وئي ڪم کي 25-27٪ تائين تيز ڪرڻ)، GCC ۾ "-O3" اختيارن سان گڏ. (5-10% جو واڌارو) ۽ "-march-native" (5-10%)، ريڊ/لائيٽ ڪالن کي recv/send (5-10%) سان تبديل ڪرڻ ۽ پيٿريڊ استعمال ڪرڻ وقت اوور هيڊ گھٽائڻ (2-3%) . ڪوڊ جي اصلاح کان پوءِ مجموعي ڪارڪردگيءَ ۾ اضافو 55% هو، ۽ 224k req/s کان 347k req/s تائين واڌارو ٿيو.
  • قياس آرائي واري عمل جي خطرن جي خلاف تحفظ کي بند ڪريو. پيرا ميٽرز کي استعمال ڪندي “nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off” جڏهن ڪرنل لوڊ ڪندي ڪارڪردگي کي 28٪ وڌائڻ جي اجازت ڏني وئي، ۽ throughput وڌائي 347k req/s کان 446k req/s تائين. الڳ الڳ، پيرا ميٽر مان واڌارو “nospectre_v1” (Specter v1 + SWAPGS کان تحفظ) 1-2٪، “nospectre_v2” (اسپيڪٽر v2 کان تحفظ) - 15-20٪، “pti=off” (Spectre v3/Meltdown) - 6٪، "mds=off tsx_async_abort=off" (MDS/Zombieload and TSX Asynchronous Abort) - 6%. L1TF/Foreshadow (l1tf=flush)، iTLB multihit، Speculative Store Bypass ۽ SRBDS حملن جي خلاف تحفظ لاءِ سيٽنگون اڻ مٽ رهجي ويون، جن ڪارڪردگيءَ کي متاثر نه ڪيو، ڇاڪاڻ ته اهي آزمائشي ترتيب سان ٽڪراءُ نه ڪندا هئا (مثال طور، KVM لاءِ مخصوص، nested ورچوئلائيزيشن ۽ ٻيا سي پي يو ماڊل).
  • "auditctl -a never,task" ڪمانڊ استعمال ڪندي آڊيٽنگ ۽ سسٽم ڪال بلاڪ ڪرڻ واري ميڪانيزم کي غير فعال ڪرڻ ۽ ڊاڪر ڪنٽينر کي شروع ڪرڻ وقت "--security-opt seccomp=unconfined" اختيار بيان ڪرڻ. مجموعي ڪارڪردگيءَ ۾ اضافو 11% هو، ۽ 446k req/s کان 495k req/s تائين واڌارو ٿيو.
  • iptables/netfilter کي غير فعال ڪرڻ سان لاڳاپيل ڪنيل ماڊلز کي لوڊ ڪندي. فائر وال کي غير فعال ڪرڻ جو خيال، جيڪو ڪنهن مخصوص سرور حل ۾ استعمال نه ڪيو ويو هو، نتيجن کي پروفائلنگ جي ذريعي اشارو ڪيو ويو، جنهن جي ذريعي nf_hook_slow فنڪشن 18٪ وقت تي عمل ڪيو. اهو نوٽ ڪيو ويو آهي ته nftables iptables کان وڌيڪ موثر ڪم ڪري ٿو، پر Amazon Linux iptables استعمال ڪرڻ جاري رکي ٿو. iptables کي غير فعال ڪرڻ کان پوء، ڪارڪردگي جي واڌ 22٪ هئي، ۽ throughput وڌي ويو 495k req/s کان 603k req/s تائين.
  • پروسيسر ڪيش استعمال جي ڪارڪردگي کي بهتر ڪرڻ لاء مختلف سي پي يو ڪور جي وچ ۾ هٿيارن جي لڏپلاڻ کي گھٽايو. اصلاح ٻنهي سطحن تي ڪئي وئي بائنڊنگ ليبريڪٽر پروسيس کي سي پي يو ڪور (سي پي يو پننگ) ۽ پننگ ڪنيل نيٽ ورڪ هينڊلرز (ريسيو سائڊ اسڪيلنگ) ذريعي. مثال طور، irqbalance غير فعال ڪيو ويو ۽ CPU سان قطار لاڳاپو واضح طور تي مقرر ڪيو ويو /proc/irq/$IRQ/smp_affinity_list. ساڳئي سي پي يو ڪور کي استعمال ڪرڻ لاءِ ليبريڪٽر جي عمل کي پروسيس ڪرڻ لاءِ ۽ ايندڙ پيڪيٽس جي نيٽ ورڪ قطار کي، هڪ ڪسٽم BPF هينڊلر استعمال ڪيو ويندو آهي، ساکٽ ٺاهڻ وقت SO_ATTACH_REUSEPORT_CBPF پرچم کي ترتيب ڏيڻ سان ڳنڍيل آهي. سي پي يو ڏانهن نڪرڻ واري پيڪٽ جي قطار کي پابند ڪرڻ لاء، سيٽنگون /sys/class/net/eth0/queues/tx- کي تبديل ڪيو ويو آهي /xps_cpus. مجموعي ڪارڪردگي جو واڌارو 38٪ هو، ۽ throughput وڌي ويو 603k req/s کان 834k req/s تائين.
  • مداخلت جي سنڀال ۽ پولنگ جي استعمال جي اصلاح. ENA ڊرائيور ۾ adaptive-rx موڊ کي چالو ڪرڻ ۽ 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 ڪارڪردگي کي متاثر ڪرڻ جو سبب هڪ خام ساکٽ استعمال ڪندي ٽرئفڪ جي تجزيو ۾ آهي.
  • اسپن لاڪ سان وڙهڻ. نيٽ ورڪ اسٽيڪ کي "noqueue" موڊ ۾ sysctl "net.core.default_qdisc=noqueue" ۽ "tc qdisc replace dev eth0 root mq" ذريعي تبديل ڪرڻ سان 2% ڪارڪردگي وڌي وئي، ۽ throughput 1.12M req/s کان وڌي 1.15M تائين درخواست
  • آخري معمولي اصلاحون، جيئن GRO (Generic Receive Offload) کي بند ڪرڻ ”ethtool -K eth0 gro off“ حڪم سان ۽ sysctl ”net.ipv4.tcp_congestion_control=reno“ استعمال ڪندي رينو سان ڪيوبڪ ڪنجيشن ڪنٽرول الگورٿم کي تبديل ڪرڻ. مجموعي پيداوار ۾ اضافو 4٪ هو. 1.15M req/s کان 1.2M req/s تائين واڌارو.

ڪم ڪندڙ اصلاحن کان علاوه، آرٽيڪل پڻ طريقن تي بحث ڪري ٿو جيڪي متوقع ڪارڪردگي وڌائڻ جي اڳواڻي نه ڪندا آھن. مثال طور، هيٺ ڏنل غير موثر ثابت ٿيا:

  • ليبريڪٽر کي الڳ الڳ هلائڻ ان کي ڪنٽينر ۾ هلائڻ کان ڪارڪردگي ۾ مختلف نه هو. Writv کي موڪلڻ سان تبديل ڪرڻ، epoll_wait ۾ maxevents وڌائڻ، ۽ GCC ورزن ۽ جھنڊن سان تجربو ڪرڻ ڪو به اثر نه پيو (اثر صرف "-O3" ۽ "-march-native" جھنڊن لاءِ قابل ذڪر ھو).
  • لينڪس ڪرنل کي ورجن 4.19 ۽ 5.4 ۾ اپڊيٽ ڪرڻ، SCHED_FIFO ۽ SCHED_RR شيڊيولرز کي استعمال ڪندي، sysctl kernel.sched_min_granularity_ns، kernel.sched_wakeup_granularity_ns، kernel.sched_wakeup_granularity_ns، transparent_hugepages=never, not source c-tskew=tick=tlock=performance متاثر ڪيو.
  • ENA ڊرائيور ۾، آف لوڊ موڊز کي فعال ڪرڻ (سيگمينٽيشن، اسڪرٽر-گھر، rx/tx چيڪسم)، "-O3" پرچم سان تعمير ڪرڻ، ۽ ena.rx_queue_size ۽ ena.force_large_llq_header parameters کي استعمال ڪرڻ جو ڪو اثر نه ٿيو.
  • نيٽ ورڪ اسٽيڪ ۾ تبديليون ڪارڪردگي بهتر نه ڪيون:
    • IPv6 کي بند ڪريو: ipv6.disable=1
    • VLAN کي بند ڪريو: 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_budget
    • net.core.dev_weight
    • 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_PRIORITY
    • TCP_NODELAY

    جو ذريعو: opennet.ru

تبصرو شامل ڪريو