በሰከንድ 1.2 ሚሊዮን የJSON ጥያቄዎችን ለማስተናገድ የሊኑክስ ማመቻቸት

የኤችቲቲፒ ጥያቄዎችን ለማስኬድ ከፍተኛ አፈጻጸም ለማግኘት የሊኑክስ አካባቢን ማስተካከል ላይ ዝርዝር መመሪያ ታትሟል። የታቀዱት ዘዴዎች የ JSON ፕሮሰሰር አፈጻጸምን በአማዞን EC2 አካባቢ (4 vCPU) ከ 224 ሺህ ኤፒአይ ጥያቄዎች በሰከንድ ከ 2 ሺህ የኤፒአይ ጥያቄዎች አማዞን ሊኑክስ 4.14 ከከርነል 1.2 እስከ 436 ሚሊዮን ጥያቄዎችን መሠረት በማድረግ የ JSON ፕሮሰሰርን አፈፃፀም ለማሳደግ አስችሏል ። ከማመቻቸት በኋላ ሁለተኛ (የ 79% ጭማሪ) እና እንዲሁም በ XNUMX% ጥያቄዎችን የማስኬድ መዘግየት እንዲቀንስ አድርጓል። የታቀዱት ዘዴዎች nginx፣ Actix፣ Netty እና Node.jsን ጨምሮ ሌሎች http አገልጋዮችን ሲጠቀሙ ለሊብሬክተር የተለዩ አይደሉም (ሊብሬክተር በፈተናዎች ውስጥ ጥቅም ላይ ውሏል ምክንያቱም በእሱ ላይ የተመሰረተ መፍትሄ የተሻለ አፈጻጸም ስላሳየ)።

በሰከንድ 1.2 ሚሊዮን የJSON ጥያቄዎችን ለማስተናገድ የሊኑክስ ማመቻቸት

መሰረታዊ ማሻሻያዎች፡-

  • የሊብሬክተር ኮድን ማመቻቸት። ከTechempower ኪት የ R18 አማራጭ እንደ መሰረት ሆኖ ጥቅም ላይ የዋለው ሲፒዩ ኮርሶችን ቁጥር ለመገደብ ኮድን በማንሳት የተሻሻለው (ማመቻቸት በ 25-27% ስራን ማፋጠን) በ GCC ውስጥ በ "-O3" አማራጮች በመገጣጠም ተሻሽሏል. (ከ5-10% ጭማሪ) እና "-march-native" (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" መለኪያ (ከ Specter v1 + SWAPGS ጥበቃ) ጭማሪ 1-2% ፣ “nospectre_v2” (ከ Specter v2 ጥበቃ) - 15-20% ፣ “pti=off” (Spectre v3/Meltdown) - 6 %፣ "mds=off tsx_async_abort=ጠፍቷል" (MDS/Zombieload እና TSX Asynchronous Abort) - 6%. ከL1TF/Foreshadow (l1tf=flush)፣ iTLB multihit፣ Speculative Store Bypass እና SRBDS ጥቃቶች የሚከላከሉበት ቅንጅቶች ሳይለወጡ ቀርተዋል፣ ይህም ከተፈተነው ውቅር ጋር ስላልተጣመሩ (ለምሳሌ ለKVM የተለየ፣ በጎጆ ላይ የተቀመጡ) በመሆናቸው አፈፃፀሙን አልነካም። ምናባዊ እና ሌሎች የሲፒዩ ሞዴሎች).
  • የ "auditctl -a never,task" ትዕዛዝን በመጠቀም የኦዲት እና የስርዓት ጥሪ ማገድ ዘዴዎችን በማሰናከል እና የመትከያ መያዣውን ሲጀምሩ "--security-opt seccomp=unconfined" የሚለውን አማራጭ ይግለጹ። አጠቃላይ አፈፃፀሙ 11% ከፍ ብሏል፣ እና የምርት ውጤቱ ከ446k req/s ወደ 495k req/s አድጓል።
  • ተያያዥ የከርነል ሞጁሎችን በማራገፍ iptables/netfilterን ማሰናከል። በአንድ የተወሰነ የአገልጋይ መፍትሄ ውስጥ ጥቅም ላይ ያልዋለውን ፋየርዎልን የማሰናከል ሀሳብ በመገለጫ ውጤቶች ተነሳሳ ፣በዚህም የ nf_hook_slow ተግባርን ለማስፈጸም 18% ጊዜ ፈጅቷል። nftables ከአይፕቴብል የበለጠ ቀልጣፋ እንደሚሠራ ተጠቁሟል፣ ነገር ግን Amazon Linux iptables መጠቀሙን ቀጥሏል። iptablesን ካሰናከለ በኋላ፣ የአፈጻጸም ጭማሪው 22% ነበር፣ እና የምርት ውጤቱ ከ495k req/s ወደ 603k req/s ጨምሯል።
  • የአቀነባባሪ መሸጎጫ አጠቃቀምን ውጤታማነት ለማሻሻል በተለያዩ የሲፒዩ ኮሮች መካከል የተቆጣጣሪዎች ፍልሰት ቀንሷል። ማመቻቸት በሁለቱም የተከናወነው ከሲፒዩ ኮሮች (ሲፒዩ ፒኒኒንግ) ጋር በማያያዝ ደረጃ እና የከርነል ኔትወርክ ተቆጣጣሪዎች (የጎን ልኬትን ተቀበል) በማያያዝ ነው። ለምሳሌ፣ irqbalance ተሰናክሏል እና ከሲፒዩ ጋር ያለው ግንኙነት በ/proc/irq/$IRQ/smp_affinity_list ውስጥ በግልፅ ተቀምጧል። ተመሳሳዩን ሲፒዩ ኮር ለመጠቀም የነጻ አድራጊ ሂደቱን እና የገቢ ፓኬቶችን የአውታረ መረብ ወረፋ ለማስኬድ ብጁ BPF ተቆጣጣሪ ጥቅም ላይ ይውላል፣ ሶኬቱን በሚፈጥሩበት ጊዜ የSO_ATTACH_REUSEPORT_CBPF ባንዲራ በማዘጋጀት ይገናኛል። የወጪ ፓኬጆችን ወረፋ ከሲፒዩ ጋር ለማያያዝ፣ መቼቶች /sys/class/net/eth0/queues/tx- ተቀይረዋል /xps_cpus አጠቃላይ የአፈጻጸም ጭማሪው 38% ሲሆን ውጤቱም ከ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ን ማሰናከል እና የአይ ፒ አድራሻውን በእጅ ማቀናበር የ6% የአፈጻጸም ጭማሪ አስከትሏል እና የምርት ውጤቱ ከ1.06ሚሬክ/ሰ ወደ 1.12M req/s ጨምሯል። dhclient አፈፃፀሙን የሚጎዳበት ምክንያት ጥሬ ሶኬት በመጠቀም በትራፊክ ትንተና ላይ ነው።
  • ስፒን መቆለፊያን መዋጋት። የአውታረ መረብ ቁልል ወደ "noqueue" ሁነታ በ sysctl "net.core.default_qdisc=noqueue" እና "tc qdisc መተካት dev eth0 root mq" ወደ 2% የአፈጻጸም እድገት አስከትሏል እና የምርት ውጤቱ ከ 1.12M req/s ወደ 1.15M ጨምሯል. req/s
  • የመጨረሻ ትንንሽ ማሻሻያዎች፣ እንደ GRO (አጠቃላይ ተቀባይ ኦፍ ጭነት) በ"ethtool -K eth0 gro off" ትዕዛዝ ማሰናከል እና የኩቢክ መጨናነቅ መቆጣጠሪያ ስልተ ቀመር sysctl "net.ipv4.tcp_congestion_control=reno"ን በመጠቀም ሬኖ መተካት። አጠቃላይ የምርታማነት ጭማሪ 4 በመቶ ነበር። የፍጆታ መጠን ከ1.15ሚ ሬክ/ሰ ወደ 1.2M req/s ጨምሯል።

ከተሰሩት ማሻሻያዎች በተጨማሪ, ጽሑፉ ወደሚጠበቀው የአፈፃፀም መጨመር ያልመሩ ዘዴዎችን ያብራራል. ለምሳሌ፣ የሚከተለው ውጤት አልባ ሆኖ ተገኝቷል፡-

  • የሚሮጥ ሊብሬክተር በተናጥል በኮንቴይነር ውስጥ ከመሮጥ በአፈፃፀም አይለይም። መጻፌን በመላክ መተካት፣ በ epoll_wait ውስጥ ከፍተኛ መጠን መጨመር እና በጂሲሲ ስሪቶች እና ባንዲራዎች መሞከር ምንም ውጤት አላመጣም (ተፅዕኖው የሚታየው ለ"-O3" እና "-March-native" ባንዲራዎች ብቻ ነው)።
  • sysctl kernel.sched_min_granularity_ns፣ kernel.sched_wakeup_granularity_ns፣ transparent_hugepages=never= sysctl kernel.sched_min_granularity_ns፣ kernel.sched_wakeup_granularity_ns፣ transparent_hugepages=never=ምንጭ =ምንጭ skewtic
  • በENA ሾፌር ውስጥ Offload ሁነታዎችን (ክፍልፋይ፣ ስተን-gather፣ rx/tx checksum)፣ በ«-O3» ባንዲራ መገንባት እና የena.rx_queue_size እና ena.force_large_llq_header መለኪያዎችን መጠቀም ምንም ውጤት አላመጣም።
  • በአውታረ መረቡ ቁልል ላይ የተደረጉ ለውጦች አፈጻጸምን አላሻሻሉም፡-
    • 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

አስተያየት ያክሉ