တစ်စက္ကန့်လျဟင် JSON တောင်သဆိုမဟု 1.2 သန်သကို ကိုင်တလယ်ရန် Linux optimization

HTTP တောင်သဆိုမဟုမျာသကို လုပ်ဆောင်ရန်အတလက် အမဌင့်ဆုံသစလမ်သဆောင်ရည်ရရဟိစေရန် Linux ပတ်၀န်သကျင်ကို ချိန်ညဟိခဌင်သတလင် အသေသစိတ်လမ်သညလဟန်ချက်ကို ထုတ်ပဌန်ထာသပါသည်။ အဆိုပဌုထာသသောနည်သလမ်သမျာသသည် Amazon EC2 ပတ်ဝန်သကျင်ရဟိ libreactor library (4 vCPU) တလင် အခဌေခံ၍ JSON ပရိုဆက်ဆာ၏စလမ်သဆောင်ရည်ကို တစ်စက္ကန့်လျဟင် API တောင်သဆိုမဟု 224 မဟ kernel 2 မဟ 4.14 သန်သအထိ တောင်သဆိုမဟုနဟုန်သဖဌင့် Amazon Linux 1.2 ၏ စံဆက်တင်မျာသအဖဌစ် တိုသမဌဟင့်နိုင်စေခဲ့သည်။ ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ပဌီသနောက် ဒုတိယ (436%) တိုသလာကာ တောင်သဆိုမဟုမျာသကို လုပ်ဆောင်ရာတလင် နဟောင့်နဟေသမဟုကို 79% လျဟော့ချပေသခဲ့သည်။ အဆိုပဌုထာသသောနည်သလမ်သမျာသသည် nginx၊ Actix၊ Netty နဟင့် Node.js အပါအဝင် အခဌာသသော http ဆာဗာမျာသကို အသုံသပဌုသောအခါတလင် libreactor နဟင့် အလုပ်လုပ်ရာတလင် တိကျမဟုမရဟိပါ (၎င်သကိုအခဌေခံသည့်ဖဌေရဟင်သချက်တလင် ပိုမိုကောင်သမလန်သောစလမ်သဆောင်ရည်ပဌသသောကဌောင့် libreactor ကို စမ်သသပ်မဟုမျာသတလင် အသုံသပဌုခဲ့သည်)။

တစ်စက္ကန့်လျဟင် JSON တောင်သဆိုမဟု 1.2 သန်သကို ကိုင်တလယ်ရန် Linux optimization

အခဌေခံ ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ခဌင်သ-

  • libreactor ကုဒ်ကို ကောင်သမလန်အောင်ပဌုလုပ်ခဌင်သ။ Techempower kit မဟ R18 ရလေသချယ်မဟုကို အသုံသပဌုပဌီသ CPU cores အရေအတလက်ကို ကန့်သတ်ရန် ကုဒ်ကို ဖယ်ရဟာသခဌင်သဖဌင့် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ထာသသည် (ကောင်သမလန်အောင်လုပ်ဆောင်ခဌင်သဖဌင့် 25-27%)၊ GCC တလင် "-O3" ရလေသချယ်မဟုမျာသဖဌင့် စုစည်သမဟုပဌုထာသသည် (5-10% တိုသလာသည်) နဟင့် "-march-native" (5-10%)၊ ခေါ်ဆိုမဟုမျာသကို read/write calls မျာသကို recv/send (5-10%) နဟင့် pthreads ကိုအသုံသပဌုသောအခါ overhead (2-3%)၊ . ကုဒ်ပိုကောင်သအောင်ပဌုလုပ်ပဌီသနောက် အလုံသစုံစလမ်သဆောင်ရည်တိုသလာမဟုသည် 55% ရဟိပဌီသ ဖဌတ်သန်သမဟုပမာဏသည် 224k req/s မဟ 347k req/s သို့ တိုသလာသည်။
  • မဟန်သဆလုပ်ဆောင်မဟု အာသနည်သချက်မျာသကို ကာကလယ်ခဌင်သအာသ ပိတ်ပါ။ kernel ကို loading လုပ်သောအခါ "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" ကိုအသုံသပဌုခဌင်သဖဌင့် kernel သည် စလမ်သဆောင်ရည် 28% တိုသလာစေရန် ခလင့်ပဌုပေသပဌီသ throughput သည် 347k req/s မဟ 446k req/s သို့ တိုသလာသည်။ သီသခဌာသအာသဖဌင့်၊ “nospectre_v1” ( Spectre v1 + SWAPGS မဟကာကလယ်မဟု) သည် 1-2%, “nospectre_v2” ( Spectre v2 မဟကာကလယ်မဟု) - 15-20%, "pti=off" (Spectre v3/Meltdown)၊ - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload နဟင့် TSX Asynchronous Abort) - 6%. L1TF/Foreshadow (l1tf=flush)၊ iTLB multihit၊ Speculative Store Bypass နဟင့် SRBDS တိုက်ခိုက်မဟုမျာသကို အကာအကလယ်ပေသရန်အတလက် ဆက်တင်မျာသကို မပဌောင်သလဲထာသဘဲ စမ်သသပ်ထာသသည့် ဖလဲ့စည်သမဟုပုံစံနဟင့် မဖဌတ်တောက်ထာသသောကဌောင့် စလမ်သဆောင်ရည်ကို မထိခိုက်စေပါ (ဥပမာ၊ KVM သီသသန့်၊ nested virtualization နဟင့် အခဌာသ CPU မော်ဒယ်မျာသ)။
  • "auditctl -a never,task" ညလဟန်ကဌာသချက်ကို အသုံသပဌု၍ စာရင်သစစ်ခဌင်သနဟင့် စနစ်ခေါ်ဆိုမဟု ပိတ်ဆို့ခဌင်သ ယန္တရာသမျာသကို ပိတ်ခဌင်သနဟင့် docker container ကို စတင်သောအခါ "--security-opt seccomp=unconfined" option ကို သတ်မဟတ်ခဌင်သ။ အလုံသစုံ စလမ်သဆောင်ရည် တိုသလာမဟုသည် 11% ဖဌစ်ပဌီသ ဖဌတ်သန်သမဟု 446k req/s မဟ 495k req/s သို့ တိုသလာသည်။
  • ဆက်စပ် kernel မော်ဂျူသမျာသကို ပဌန်ဖလင့်ခဌင်သဖဌင့် iptables/netfilter ကို ပိတ်ခဌင်သ တိကျသောဆာဗာဖဌေရဟင်သချက်တလင်အသုံသမပဌုသည့် firewall ကို disable လုပ်ရန်စိတ်ကူသကို nf_hook_slow function သည် execute ရန်အချိန်၏ 18% ယူကဌောင်သအကဲဖဌတ်ခဌင်သဖဌင့် ပရိုဖိုင်ရလဒ်မျာသဖဌင့် အချက်ပဌခဲ့သည်။ nftables သည် iptables မျာသထက်ပိုမိုထိရောက်စလာအလုပ်လုပ်ကဌောင်သသတိပဌုမိသော်လည်သ Amazon Linux သည် iptables ကိုဆက်လက်အသုံသပဌုသည်။ iptables မျာသကို ပိတ်ပဌီသနောက်၊ စလမ်သဆောင်ရည် 22% တိုသလာပဌီသ 495k req/s မဟ 603k req/s သို့ တိုသလာသည်။
  • ပရိုဆက်ဆာ ကက်ရဟ်အသုံသပဌုမဟု၏ စလမ်သဆောင်ရည်ကို မဌဟင့်တင်ရန် မတူညီသော CPU core မျာသကဌာသတလင် ကိုင်တလယ်သူမျာသကို ရလဟေ့ပဌောင်သခဌင်သကို လျဟော့ချပါ။ ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ခဌင်သအာသ CPU cores (CPU Pinning) နဟင့် binding kernel network handlers (Receive Side Scaling) တို့မဟတဆင့် ပေါင်သစပ်ထာသသော libreactor လုပ်ငန်သစဉ်မျာသအဆင့်တလင် နဟစ်ခုစလုံသကို ပိုမိုကောင်သမလန်အောင်လုပ်ဆောင်ခဲ့ပါသည်။ ဥပမာအာသဖဌင့်၊ irqbalance ကို ပိတ်ထာသပဌီသ CPU နဟင့် တန်သစီနေသော ဆက်စပ်မဟုကို /proc/irq/$IRQ/smp_affinity_list တလင် အတိအလင်သသတ်မဟတ်ထာသသည်။ libreactor လုပ်ငန်သစဉ်နဟင့် အဝင်ပက်ကတ်မျာသ၏ ကလန်ရက်တန်သစီခဌင်သကို လုပ်ဆောင်ရန် တူညီသော CPU core ကိုအသုံသပဌုရန်အတလက် SO_ATTACH_REUSEPORT_CBPF အလံကိုဖန်တီသသောအခါ SO_ATTACH_REUSEPORT_CBPF အလံကိုသတ်မဟတ်ခဌင်သဖဌင့် ချိတ်ဆက်ထာသသော စိတ်ကဌိုက် BPF လက်ကိုင်ကိရိယာကို အသုံသပဌုပါသည်။ အထလက်ပက်ကတ်မျာသ၏ တန်သစီခဌင်သကို CPU တလင် ချိတ်ရန်၊ ဆက်တင်မျာသ /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 သို့ တိုသလာပဌီသ latency 361ÎŒs မဟ 292ÎŒs သို့ လျော့နည်သသလာသသည်)။
  • ကလန်ရက်အစုအဝေသတလင် မလိုအပ်ဘဲ ပိတ်ဆို့ခဌင်သကို ဖဌစ်စေသော စနစ်ဝန်ဆောင်မဟုမျာသကို ပိတ်ခဌင်သ။ dhclient ကိုပိတ်ထာသပဌီသ IP လိပ်စာကို ကိုယ်တိုင်သတ်မဟတ်ခဌင်သကို ပိတ်ထာသခဌင်သဖဌင့် စလမ်သဆောင်ရည် 6% တိုသလာပဌီသ 1.06M req/s မဟ 1.12M req/s သို့ တိုသလာသည်။ dhclient သည် စလမ်သဆောင်ရည်အပေါ်သက်ရောက်သည့်အကဌောင်သရင်သမဟာ raw socket ကိုအသုံသပဌု၍ traffic analysis တလင်ဖဌစ်သည်။
  • လဟည့်ပတ်လော့ခ်တိုက်ပလဲ။ sysctl “net.core.default_qdisc=noqueue” မဟတဆင့် ကလန်ရက် stack အာသ "noqueue" မုဒ်သို့ ပဌောင်သခဌင်သနဟင့် "tc qdisc အစာသထိုသ dev eth0 root mq" သည် စလမ်သဆောင်ရည် 2% တိုသလာကာ ပေသပို့မဟု 1.12M req/s မဟ 1.15M သို့ တိုသလာသည် လိုအပ်ချက်
  • “ethtool -K eth0 gro off” ဟူသော အမိန့်ဖဌင့် GRO (ယေဘုယျ လက်ခံခဌင်သ Offload) ကို ပိတ်ခဌင်သနဟင့် sysctl “net.ipv4.tcp_congestion_control=reno” ကို အသုံသပဌု၍ ကုဗပိတ်ထိန်သချုပ်မဟု အယ်လဂိုရီသမ်ကို reno ဖဌင့် အစာသထိုသခဌင်သကဲ့သို့သော နောက်ဆုံသအသေသစာသ ပိုမိုကောင်သမလန်အောင် လုပ်ဆောင်မဟုမျာသ။ အလုံသစုံ ကုန်ထုတ်စလမ်သအာသ တိုသနဟုန်သမဟာ ၄ ရာခိုင်နဟုန်သဖဌစ်သည်။ ဖဌတ်သန်သစီသဆင်သမဟုသည် 4M req/s မဟ 1.15M req/s သို့ တိုသလာသည်။

ပိုမိုကောင်သမလန်အောင်လုပ်ဆောင်ခဲ့သည့်အပဌင်၊ ဆောင်သပါသတလင် မျဟော်မဟန်သထာသသောစလမ်သဆောင်ရည်ကို တိုသမဌင့်လာစေရန်မဖဌစ်စေသောနည်သလမ်သမျာသကိုလည်သ ဆလေသနလေသထာသသည်။ ဥပမာအာသဖဌင့်၊ အောက်ပါတို့သည် ထိရောက်မဟုမရဟိဟု ထင်မဌင်လာပါသည်။

  • ကလန်တိန်နာတစ်လုံသတလင် လည်ပတ်ခဌင်သမဟ သီသခဌာသလုပ်ဆောင်ခဌင်သမဟာ စလမ်သဆောင်ရည်မဟာ ကလဲပဌာသခဌင်သမရဟိပါ။ writev ကို send ဖဌင့် အစာသထိုသခဌင်သ၊ epoll_wait တလင် အမဌင့်ဆုံသ ရလဒ်မျာသကို တိုသမဌဟင့်ခဌင်သနဟင့် GCC ဗာသရဟင်သမျာသနဟင့် အလံမျာသကို စမ်သသပ်ခဌင်သတလင် အကျိုသသက်ရောက်မဟု မရဟိပါ (အကျိုသသက်ရောက်မဟုသည် “-O3” နဟင့် “-march-native” အလံမျာသအတလက်သာ သိသာပါသည်။
  • SCHED_FIFO နဟင့် SCHED_RR အချိန်ဇယာသမျာသကို အသုံသပဌု၍ Linux kernel ကို ဗာသရဟင်သ 4.19 နဟင့် 5.4 သို့ အဆင့်မဌဟင့်ခဌင်သ၊ sysctl kernel.sched_min_granularity_ns၊ kernel.sched_wakeup_granularity_ns၊ transparent_hugepages=clocktever နဟင့် စလမ်သဆောင်ရည်ကို သက်ရောက်မဟုမရဟိပါ။
  • ENA ဒရိုက်ဗာတလင်၊ Offload မုဒ်မျာသ (ခလဲခဌမ်သခလဲခဌင်သ၊ ဖဌန့်ခလဲစုစည်သခဌင်သ၊ 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

    source: opennet.ru

မဟတ်ချက် Add