Pag-optimize sa Linux aron madumala ang 1.2 milyon nga mga hangyo sa JSON matag segundo

Usa ka detalyado nga giya ang gipatik sa pag-tune sa Linux environment aron makab-ot ang pinakataas nga performance para sa pagproseso sa HTTP requests. Ang gisugyot nga mga pamaagi nagpaposible nga madugangan ang pasundayag sa JSON processor nga gibase sa libreactor library sa Amazon EC2 environment (4 vCPU) gikan sa 224 ka libo nga mga hangyo sa API kada segundo nga adunay standard nga mga setting sa Amazon Linux 2 nga adunay kernel 4.14 ngadto sa 1.2 ka milyon nga mga hangyo kada segundo. ikaduha human sa pag-optimize (usa ka pagtaas sa 436%), ug misangpot usab sa pagkunhod sa mga paglangan sa pagproseso sa mga hangyo sa 79%. Ang gisugyot nga mga pamaagi dili espesipiko sa libreactor ug magtrabaho kung mogamit sa ubang mga http server, lakip ang nginx, Actix, Netty ug Node.js (libreactor gigamit sa mga pagsulay tungod kay ang solusyon nga gibase niini nagpakita og mas maayo nga performance).

Pag-optimize sa Linux aron madumala ang 1.2 milyon nga mga hangyo sa JSON matag segundo

Panguna nga mga pag-optimize:

  • Pag-optimize sa libreactor code. Ang opsyon sa R18 gikan sa Techmpower kit gigamit isip basehan, nga gipalambo pinaagi sa pagtangtang sa code aron limitahan ang gidaghanon sa CPU cores nga gigamit (pag-optimize nagtugot sa pagpadali sa trabaho sa 25-27%), pag-assemble sa GCC gamit ang "-O3" nga mga kapilian (usa ka pagtaas sa 5-10%) ug "-march-native" (5-10%), pag-ilis sa read/write nga mga tawag sa recv/send (5-10%) ug pagkunhod sa overhead kon gamiton ang pthreads (2-3%) . Ang kinatibuk-ang pagtaas sa performance pagkahuman sa pag-optimize sa code mao ang 55%, ug ang throughput misaka gikan sa 224k req/s ngadto sa 347k req/s.
  • I-disable ang proteksyon batok sa mga kahuyangan sa pagpamatay sa espekulasyon. Gamit ang mga parametro nga β€œnospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off” kung ang pagkarga sa kernel gitugotan nga madugangan ang performance sa 28%, ug ang throughput misaka gikan sa 347k req/s ngadto sa 446k req/s. Gilain, ang pagtaas gikan sa parameter nga "nospectre_v1" (proteksyon gikan sa Spectre v1 + SWAPGS) mao ang 1-2%, "nospectre_v2" (proteksyon gikan sa Spectre v2) - 15-20%, "pti = off" (Spectre v3 / Meltdown) - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload ug TSX Asynchronous Abort) - 6%. Ang mga setting alang sa proteksyon batok sa L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass ug mga pag-atake sa SRBDS wala mausab, nga wala makaapekto sa performance tungod kay wala sila mag-intersect sa gisulayan nga configuration (pananglitan, espesipiko sa KVM, nested virtualization ug uban pang mga modelo sa CPU).
  • Pag-disable sa pag-audit ug mga mekanismo sa pag-block sa tawag sa sistema gamit ang "auditctl -a never,task" nga sugo ug gipiho ang "--security-opt seccomp=unconfined" nga kapilian sa pagsugod sa docker container. Ang kinatibuk-ang pagtaas sa performance maoy 11%, ug ang throughput misaka gikan sa 446k req/s ngadto sa 495k req/s.
  • Pag-disable sa iptables/netfilter pinaagi sa pagdiskarga sa mga kaubang kernel modules. Ang ideya sa pag-disable sa firewall, nga wala gigamit sa usa ka piho nga solusyon sa server, giaghat sa mga resulta sa pag-profile, kung diin ang function sa nf_hook_slow mikuha sa 18% sa oras aron ipatuman. Namatikdan nga ang nftables mas epektibo kay sa mga iptables, apan ang Amazon Linux nagpadayon sa paggamit sa mga iptables. Pagkahuman sa pag-disable sa mga iptables, ang pagtaas sa pasundayag 22%, ug ang throughput misaka gikan sa 495k req/s hangtod sa 603k req/s.
  • Gipamub-an ang paglalin sa mga tigdumala tali sa lainlaing mga core sa CPU aron mapauswag ang kahusayan sa paggamit sa cache sa processor. Ang pag-optimize gihimo sa parehas nga lebel sa pagbugkos nga libreactor nga mga proseso sa mga cores sa CPU (CPU Pinning) ug pinaagi sa pag-pin sa kernel network handler (Receive Side Scaling). Pananglitan, ang irqbalance na-disable ug ang queue affinity sa CPU klarong gibutang sa /proc/irq/$IRQ/smp_affinity_list. Aron magamit ang parehas nga kinauyokan sa CPU aron maproseso ang proseso sa libreactor ug ang pila sa network sa umaabot nga mga pakete, usa ka naandan nga handler sa BPF ang gigamit, konektado pinaagi sa pagbutang sa bandila sa SO_ATTACH_REUSEPORT_CBPF sa paghimo sa socket. Aron mabugkos ang mga pila sa nanggawas nga mga pakete sa CPU, ang mga setting /sys/class/net/eth0/queues/tx- giusab. /xps_cpus. Ang kinatibuk-ang pagtaas sa performance mao ang 38%, ug ang throughput misaka gikan sa 603k req/s ngadto sa 834k req/s.
  • Pag-optimize sa interrupt nga pagdumala ug paggamit sa polling. Ang pagpagana sa adaptive-rx mode sa ENA driver ug pagmaniobra sa sysctl net.core.busy_read misaka sa performance sa 28% (throughput misaka gikan sa 834k req/s ngadto sa 1.06M req/s, ug ang latency mikunhod gikan sa 361ΞΌs ngadto sa 292ΞΌs).
  • Pag-disable sa mga serbisyo sa sistema nga mosangpot sa dili kinahanglan nga pag-block sa network stack. Ang pag-disable sa dhclient ug mano-mano nga pag-set sa IP address miresulta sa 6% nga pagtaas sa performance ug ang throughput misaka gikan sa 1.06M req/s ngadto sa 1.12M req/s. Ang hinungdan nga ang dhclient nakaapekto sa pasundayag mao ang pagtuki sa trapiko gamit ang usa ka hilaw nga socket.
  • Pag-away sa Spin Lock. Ang pagbalhin sa network stack ngadto sa "noqueue" mode pinaagi sa sysctl "net.core.default_qdisc=noqueue" ug "tc qdisc replace dev eth0 root mq" misangpot sa 2% nga pagtaas sa performance, ug ang throughput misaka gikan sa 1.12M req/s ngadto sa 1.15M req/s.
  • Katapusan nga menor de edad nga pag-optimize, sama sa pag-disable sa GRO (Generic Receive Offload) gamit ang command "ethtool -K eth0 gro off" ug pag-ilis sa cubic congestion control algorithm sa reno gamit ang sysctl "net.ipv4.tcp_congestion_control=reno". Ang kinatibuk-ang pagtaas sa produktibo mao ang 4%. Ang throughput misaka gikan sa 1.15M req/s ngadto sa 1.2M req/s.

Gawas pa sa mga pag-optimize nga nagtrabaho, ang artikulo usab naghisgot sa mga pamaagi nga wala magdala sa gipaabut nga pagtaas sa pasundayag. Pananglitan, ang mosunod nahimong dili epektibo:

  • Ang pagpadagan sa libreactor nga bulag wala magkalahi sa pasundayag gikan sa pagpadagan niini sa usa ka sudlanan. Ang pag-ilis sa writev og send, pagpadaghan sa maxevents sa epoll_wait, ug ang pag-eksperimento sa GCC nga mga bersyon ug mga flag walay epekto (ang epekto mamatikdan lamang sa "-O3" ug "-march-native" nga mga bandila).
  • Pag-upgrade sa Linux kernel ngadto sa bersyon 4.19 ug 5.4, gamit ang SCHED_FIFO ug SCHED_RR schedulers, pagmaniobra sa sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=never, skew_tick=1 ug clocksource=tsc wala makaapekto sa performance.
  • Sa ENA driver, ang pagpagana sa Offload modes (segmentation, scatter-gather, rx/tx checksum), pagtukod gamit ang "-O3" nga bandila, ug ang paggamit sa ena.rx_queue_size ug ena.force_large_llq_header nga mga parameter walay epekto.
  • Ang mga pagbag-o sa network stack wala makapauswag sa performance:
    • I-disable ang IPv6: ipv6.disable=1
    • I-disable ang VLAN: modprobe -rv 8021q
    • I-disable ang pagsusi sa tinubdan sa package
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (negatibo nga epekto)
    • 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

Idugang sa usa ka comment