సెకనుకు 1.2 మిలియన్ JSON అభ్యర్థనలను నిర్వహించడానికి Linuxని ఆప్టిమైజ్ చేయడం

HTTP అభ్యర్థనలను ప్రాసెస్ చేయడం కోసం గరిష్ట పనితీరును సాధించడానికి Linux పర్యావరణాన్ని ట్యూన్ చేయడంపై వివరణాత్మక గైడ్ ప్రచురించబడింది. ప్రతిపాదిత పద్ధతులు అమెజాన్ EC2 వాతావరణంలో (4 vCPU) లైబ్రేక్టర్ లైబ్రరీ ఆధారంగా JSON ప్రాసెసర్ పనితీరును సెకనుకు 224 వేల API అభ్యర్థనల నుండి Amazon Linux 2 యొక్క ప్రామాణిక సెట్టింగ్‌లతో కెర్నల్ 4.14 నుండి 1.2 మిలియన్ అభ్యర్థనలకు పెంచడం సాధ్యం చేసింది. ఆప్టిమైజేషన్ తర్వాత రెండవది (436% పెరుగుదల), మరియు అభ్యర్థనలను ప్రాసెస్ చేయడంలో ఆలస్యం 79% తగ్గింపుకు దారితీసింది. nginx, Actix, Netty మరియు Node.jsతో సహా ఇతర http సర్వర్‌లను ఉపయోగిస్తున్నప్పుడు ప్రతిపాదిత పద్ధతులు libreactor మరియు పనికి ప్రత్యేకమైనవి కావు (లిబ్రేక్టర్ పరీక్షలలో ఉపయోగించబడింది ఎందుకంటే దాని ఆధారంగా పరిష్కారం మెరుగైన పనితీరును చూపింది).

సెకనుకు 1.2 మిలియన్ JSON అభ్యర్థనలను నిర్వహించడానికి Linuxని ఆప్టిమైజ్ చేయడం

ప్రాథమిక ఆప్టిమైజేషన్లు:

  • లిబ్రేక్టర్ కోడ్‌ని ఆప్టిమైజ్ చేయడం. టెకెమ్‌పవర్ కిట్ నుండి R18 ఎంపికను ప్రాతిపదికగా ఉపయోగించారు, ఉపయోగించిన CPU కోర్ల సంఖ్యను పరిమితం చేయడానికి కోడ్‌ను తీసివేయడం ద్వారా మెరుగుపరచబడింది (ఆప్టిమైజేషన్ పనిని 25-27% వరకు వేగవంతం చేయడానికి అనుమతించబడింది), GCCలో “-O3” ఎంపికలతో అసెంబ్లింగ్ చేయబడింది. (5-10% పెరుగుదల) మరియు "-మార్చ్-నేటివ్" (5-10%), రీడ్/రైట్ కాల్‌లను recv/send (5-10%)తో భర్తీ చేయడం మరియు pthreads ఉపయోగిస్తున్నప్పుడు ఓవర్‌హెడ్‌ని తగ్గించడం (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" (Spectre v3/Meltdown) - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload మరియు TSX అసమకాలిక అబార్ట్) - 6%. L1TF/Foreshadow (l1tf=flush), iTLB మల్టీహిట్, స్పెక్యులేటివ్ స్టోర్ బైపాస్ మరియు SRBDS దాడులకు వ్యతిరేకంగా రక్షణ కోసం సెట్టింగ్‌లు మారలేదు, అవి పరీక్షించిన కాన్ఫిగరేషన్‌తో కలుస్తాయి (ఉదాహరణకు, KVMకి ప్రత్యేకమైనవి, నెస్టెడ్) పనితీరును ప్రభావితం చేయలేదు. వర్చువలైజేషన్ మరియు ఇతర CPU నమూనాలు).
  • "auditctl -a never,task" ఆదేశాన్ని ఉపయోగించి ఆడిటింగ్ మరియు సిస్టమ్ కాల్ బ్లాకింగ్ మెకానిజమ్‌లను నిలిపివేయడం మరియు డాకర్ కంటైనర్‌ను ప్రారంభించేటప్పుడు "--security-opt seccomp=unconfined" ఎంపికను పేర్కొనడం. మొత్తం పనితీరు పెరుగుదల 11%, మరియు నిర్గమాంశ 446k req/s నుండి 495k req/sకి పెరిగింది.
  • అనుబంధిత కెర్నల్ మాడ్యూల్‌లను అన్‌లోడ్ చేయడం ద్వారా iptables/netfilterని నిలిపివేయడం. నిర్దిష్ట సర్వర్ సొల్యూషన్‌లో ఉపయోగించని ఫైర్‌వాల్‌ను నిలిపివేయాలనే ఆలోచన, ప్రొఫైలింగ్ ఫలితాల ద్వారా ప్రాంప్ట్ చేయబడింది, దీని ఆధారంగా nf_hook_slow ఫంక్షన్‌ని అమలు చేయడానికి 18% సమయం పట్టింది. iptables కంటే nftables మరింత సమర్ధవంతంగా పనిచేస్తాయని గుర్తించబడింది, అయితే Amazon Linux iptablesని ఉపయోగించడం కొనసాగిస్తోంది. iptablesని నిలిపివేసిన తర్వాత, పనితీరు పెరుగుదల 22%, మరియు నిర్గమాంశ 495k req/s నుండి 603k req/sకి పెరిగింది.
  • ప్రాసెసర్ కాష్ వినియోగం యొక్క సామర్థ్యాన్ని మెరుగుపరచడానికి వివిధ CPU కోర్ల మధ్య హ్యాండ్లర్ల మైగ్రేషన్ తగ్గించబడింది. ఆప్టిమైజేషన్ లిబ్రేక్టర్ ప్రక్రియలను CPU కోర్లకు (CPU పిన్నింగ్) బైండింగ్ చేసే స్థాయిలో మరియు పిన్నింగ్ కెర్నల్ నెట్‌వర్క్ హ్యాండ్లర్ల ద్వారా (రిసీవ్ సైడ్ స్కేలింగ్) రెండింటిలోనూ నిర్వహించబడింది. ఉదాహరణకు, irqbalance నిలిపివేయబడింది మరియు CPUకి క్యూ అనుబంధం స్పష్టంగా /proc/irq/$IRQ/smp_affinity_listలో సెట్ చేయబడింది. లిబ్రేక్టర్ ప్రాసెస్ మరియు ఇన్‌కమింగ్ ప్యాకెట్ల నెట్‌వర్క్ క్యూని ప్రాసెస్ చేయడానికి అదే CPU కోర్‌ని ఉపయోగించడానికి, సాకెట్‌ను సృష్టించేటప్పుడు SO_ATTACH_REUSEPORT_CBPF ఫ్లాగ్‌ని సెట్ చేయడం ద్వారా కనెక్ట్ చేయబడిన కస్టమ్ BPF హ్యాండ్లర్ ఉపయోగించబడుతుంది. అవుట్‌గోయింగ్ ప్యాకెట్‌ల క్యూలను CPUకి బైండ్ చేయడానికి, సెట్టింగ్‌లు /sys/class/net/eth0/queues/tx- మార్చబడ్డాయి /xps_cpus. మొత్తం పనితీరు పెరుగుదల 38%, మరియు నిర్గమాంశ 603k req/s నుండి 834k req/sకి పెరిగింది.
  • అంతరాయ నిర్వహణ మరియు పోలింగ్ యొక్క ఉపయోగం యొక్క ఆప్టిమైజేషన్. ENA డ్రైవర్‌లో అడాప్టివ్-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 పనితీరును ప్రభావితం చేయడానికి కారణం రా సాకెట్‌ని ఉపయోగించి ట్రాఫిక్ విశ్లేషణ.
  • స్పిన్ లాక్‌తో పోరాడుతోంది. sysctl “net.core.default_qdisc=noqueue” మరియు “tc qdisc రీప్లేస్ dev eth0 root mq” ద్వారా నెట్‌వర్క్ స్టాక్‌ను “noqueue” మోడ్‌కి మార్చడం వలన 2% పనితీరు పెరుగుదలకు దారితీసింది మరియు నిర్గమాంశ 1.12M req/s నుండి 1.15Mకి పెరిగింది. req/s.
  • “ethtool -K eth0 gro off” కమాండ్‌తో GRO (జనరిక్ రిసీవ్ ఆఫ్‌లోడ్)ని నిలిపివేయడం మరియు sysctl “net.ipv4.tcp_congestion_control=reno”ని ఉపయోగించి క్యూబిక్ రద్దీ నియంత్రణ అల్గారిథమ్‌ని రెనోతో భర్తీ చేయడం వంటి చివరి చిన్న ఆప్టిమైజేషన్‌లు. మొత్తం ఉత్పాదకత పెరుగుదల 4%. నిర్గమాంశ 1.15M req/s నుండి 1.2M req/sకి పెరిగింది.

పనిచేసిన ఆప్టిమైజేషన్‌లతో పాటు, ఊహించిన పనితీరు పెరుగుదలకు దారితీయని పద్ధతులను కూడా వ్యాసం చర్చిస్తుంది. ఉదాహరణకు, కిందివి పనికిరానివిగా మారాయి:

  • లైబ్రేక్టర్‌ని విడిగా అమలు చేయడం అనేది కంటైనర్‌లో అమలు చేయడం కంటే పనితీరులో తేడా లేదు. రైటేవ్‌ని సెండ్‌తో భర్తీ చేయడం, ఎపోల్_వెయిట్‌లో గరిష్ట ఈవెంట్‌లను పెంచడం మరియు జిసిసి వెర్షన్‌లు మరియు ఫ్లాగ్‌లతో ప్రయోగాలు చేయడం వల్ల ఎటువంటి ప్రభావం లేదు (ఈ ప్రభావం “-ఓ3” మరియు “-మార్చ్-నేటివ్” ఫ్లాగ్‌లకు మాత్రమే గుర్తించదగినది).
  • Linux కెర్నల్‌ను సంస్కరణలు 4.19 మరియు 5.4కి అప్‌గ్రేడ్ చేయడం, SCHED_FIFO మరియు SCHED_RR షెడ్యూలర్‌లను ఉపయోగించి, sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_clock=hugetsed ప్రభావితం చేయలేదు.
  • ENA డ్రైవర్‌లో, ఆఫ్‌లోడ్ మోడ్‌లను ప్రారంభించడం (సెగ్మెంటేషన్, స్కాటర్-గేదర్, rx/tx చెక్‌సమ్), “-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

ఒక వ్యాఖ్యను జోడించండి