L-ottimizzazzjoni tal-Linux biex timmaniġġja 1.2 miljun talba JSON kull sekonda

Ġiet ippubblikata gwida dettaljata dwar l-irfinar tal-ambjent Linux biex tinkiseb prestazzjoni massima għall-ipproċessar tat-talbiet HTTP. Il-metodi proposti għamluha possibbli li tiżdied il-prestazzjoni tal-proċessur JSON ibbażat fuq il-librerija libreactor fl-ambjent Amazon EC2 (4 vCPU) minn 224 elf talba API kull sekonda b'settings standard ta 'Amazon Linux 2 b'kernel 4.14 għal 1.2 miljun talba għal kull it-tieni wara l-ottimizzazzjoni (żieda ta '436%), u wassal ukoll għal tnaqqis fid-dewmien fl-ipproċessar tat-talbiet b'79%. Il-metodi proposti mhumiex speċifiċi għal libreactor u jaħdmu meta jintużaw servers http oħra, inklużi nginx, Actix, Netty u Node.js (libreactor intuża fit-testijiet minħabba li s-soluzzjoni bbażata fuqha wriet prestazzjoni aħjar).

L-ottimizzazzjoni tal-Linux biex timmaniġġja 1.2 miljun talba JSON kull sekonda

Ottimizzazzjonijiet bażiċi:

  • Ottimizzazzjoni tal-kodiċi tal-libreactor. L-għażla R18 mill-kit Techempower intużat bħala bażi, li ġiet imtejba billi tneħħiet il-kodiċi biex jillimita n-numru ta 'cores CPU użati (l-ottimizzazzjoni ppermettiet li titħaffef ix-xogħol b'25-27%), assemblaġġ f'GCC bl-għażliet "-O3" (żieda ta '5-10% ) u "-march-native" (5-10%), tissostitwixxi sejħiet ta' qari/kitba b'recv/send (5-10%) u tnaqqas l-overhead meta tuża pthreads (2-3%) . Iż-żieda fil-prestazzjoni ġenerali wara l-ottimizzazzjoni tal-kodiċi kienet ta '55%, u l-fluss żdied minn 224k req/s għal 347k req/s.
  • Iddiżattiva l-protezzjoni kontra vulnerabbiltajiet ta' eżekuzzjoni spekulattiva. L-użu tal-parametri "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" meta t-tagħbija tal-qalba tħalliet iżid il-prestazzjoni bi 28%, u l-fluss żdied minn 347k req/s għal 446k req/s. Separatament, iż-żieda mill-parametru "nospectre_v1" (protezzjoni minn Spectre v1 + SWAPGS) kienet 1-2%, "nospectre_v2" (protezzjoni minn Spectre v2) - 15-20%, "pti=off" (Spectre v3/Meltdown) - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload u TSX Asynchronous Abort) - 6%. Is-settings għall-protezzjoni kontra L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass u attakki SRBDS tħallew mhux mibdula, li ma affettwawx il-prestazzjoni peress li ma jaqsmux mal-konfigurazzjoni ttestjata (per eżempju, speċifiċi għal KVM, nested virtwalizzazzjoni u mudelli oħrajn ta’ CPU).
  • Id-diżattivazzjoni tal-mekkaniżmi tal-awditjar u l-imblukkar tas-sejħiet tas-sistema billi tuża l-kmand "auditctl -a never,task" u tispeċifika l-għażla "--security-opt seccomp=unconfined" meta tibda l-kontenitur docker. Iż-żieda fil-prestazzjoni ġenerali kienet ta '11%, u l-fluss żdied minn 446k req/s għal 495k req/s.
  • Id-diżattivazzjoni ta' iptables/netfilter billi tħoll il-moduli tal-kernel assoċjati. L-idea li jiġi diżattivat il-firewall, li ma ntużax f'soluzzjoni speċifika ta 'server, ġiet imqanqla mir-riżultati tal-profiling, ġġudikati minn liema l-funzjoni nf_hook_slow ħadet 18% tal-ħin biex tesegwixxi. Huwa nnutat li nftables jaħdem b'mod aktar effiċjenti minn iptables, iżda Amazon Linux tkompli tuża iptables. Wara li ddiżattiva l-iptables, iż-żieda fil-prestazzjoni kienet ta '22%, u l-fluss żdied minn 495k req/s għal 603k req/s.
  • Migrazzjoni mnaqqsa ta 'handlers bejn cores CPU differenti biex tittejjeb l-effiċjenza tal-użu tal-cache tal-proċessur. L-ottimizzazzjoni twettqet kemm fil-livell ta 'proċessi ta' libreactor li jorbtu għal CPU cores (CPU Pinning) kif ukoll permezz ta 'pinning kernel network handlers (Receive Side Scaling). Pereżempju, irqbalance ġie diżattivat u l-affinità tal-kju mas-CPU ġiet issettjata b'mod espliċitu f'/proc/irq/$IRQ/smp_affinity_list. Biex tuża l-istess qalba tas-CPU biex tipproċessa l-proċess ta 'libreactor u l-kju tan-netwerk ta' pakketti deħlin, jintuża handler BPF personalizzat, imqabbad billi tissettja l-bandiera SO_ATTACH_REUSEPORT_CBPF meta toħloq is-sokit. Biex torbot kjuwijiet ta' pakketti ħerġin mas-CPU, is-settings /sys/class/net/eth0/queues/tx- ġew mibdula /xps_cpus. Iż-żieda ġenerali fil-prestazzjoni kienet ta '38%, u l-fluss żdied minn 603k req/s għal 834k req/s.
  • Ottimizzazzjoni tal-immaniġġjar tal-interruzzjonijiet u l-użu tal-votazzjoni. L-attivazzjoni tal-mod adattivi-rx fis-sewwieq ENA u l-manipulazzjoni tas-sysctl net.core.busy_read żiedu l-prestazzjoni bi 28% (il-fluss żdied minn 834k req/s għal 1.06M req/s, u l-latency naqset minn 361μs għal 292μs).
  • Id-diżattivazzjoni tas-servizzi tas-sistema li jwasslu għal imblukkar mhux meħtieġ fil-munzell tan-netwerk. Id-diżattivazzjoni ta' dhclient u l-issettjar manwalment tal-indirizz IP rriżultaw f'żieda fil-prestazzjoni ta' 6% u l-fluss żdied minn 1.06M req/s għal 1.12M req/s. Ir-raġuni li dhclient jaffettwa l-prestazzjoni hija fl-analiżi tat-traffiku bl-użu ta 'socket mhux maħdum.
  • Ġlieda kontra Spin Lock. Il-bdil tal-munzell tan-netwerk għall-modalità "noqueue" permezz ta' sysctl "net.core.default_qdisc=noqueue" u "tc qdisc replace dev eth0 root mq" wassal għal żieda fil-prestazzjoni ta' 2%, u l-fluss żdied minn 1.12M req/s għal 1.15M req/s.
  • Ottimizzazzjonijiet minuri finali, bħall-diżattivazzjoni ta 'GRO (Ġeneric Receive Offload) bil-kmand "ethtool -K eth0 gro off" u tibdil tal-algoritmu tal-kontroll tal-konġestjoni kubika b'reno bl-użu ta' sysctl "net.ipv4.tcp_congestion_control=reno". Iż-żieda ġenerali fil-produttività kienet ta' 4%. It-throughput żdied minn 1.15M req/s għal 1.2M req/s.

Minbarra l-ottimizzazzjonijiet li ħadmu, l-artikolu jiddiskuti wkoll metodi li ma wasslux għaż-żieda fil-prestazzjoni mistennija. Pereżempju, dan li ġej irriżulta li ma kienx effettiv:

  • It-tħaddim tal-libreactor separatament ma kienx differenti fil-prestazzjoni milli t-tħaddim tiegħu f'kontenitur. Is-sostituzzjoni ta’ writev ma’ send, iż-żieda tal-maxevents f’epoll_wait, u l-esperimentazzjoni b’verżjonijiet u bnadar tal-GCC ma kellhom l-ebda effett (l-effett kien notevoli biss għall-bnadar “-O3” u “-march-native”).
  • Aġġornament tal-kernel tal-Linux għall-verżjonijiet 4.19 u 5.4, bl-użu ta 'schedulers SCHED_FIFO u SCHED_RR, jimmanipulaw sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=qatt, skew_source=ts1 ma affettwawx.
  • Fis-sewwieq ENA, l-attivazzjoni tal-modi ta 'Offload (segmentazzjoni, scatter-gather, checksum rx/tx), il-bini bil-bandiera "-O3", u l-użu tal-parametri ena.rx_queue_size u ena.force_large_llq_header ma kellhom l-ebda effett.
  • Bidliet fil-munzell tan-netwerk ma tejbux il-prestazzjoni:
    • Itfi IPv6: ipv6.disable=1
    • Itfi VLAN: modprobe -rv 8021q
    • Iddiżattiva l-iċċekkjar tas-sors tal-pakkett
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (effett negattiv)
    • 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

    Sors: opennet.ru

Żid kumment