Avaldati ĂŒksikasjalik juhend Linuxi keskkonna tuuninguks HTTP-pĂ€ringute maksimaalse tĂ”hususe saavutamiseks. Pakutud meetodid vĂ”imaldasid tĂ”sta JSON-i töötleja, mis pĂ”hines libreactor-raamatukogul, jĂ”udlust Amazon EC2 (4 vCPU) keskkonnas 224 000 API-pĂ€ringult sekundis Amazon Linux 2 vaikeseadetes 4.14 tuumaga 1,2 miljoni pĂ€ringuni sekundis pĂ€rast optimeerimist (kasvu 436%), ning vĂ€hendada pĂ€ringute töötlemise viivitusi 79%. Pakutud meetodid ei ole spetsiifilised libreactorile ja töötavad ka teiste http-serverite, sealhulgas nginx, Actix, Netty ja Node.js, puhul (libreactorit kasutati testides, kuna selle pĂ”hine lahendus nĂ€itas parimat jĂ”udlust).

Peamised optimeerimised:
- libreactori koodi optimeerimine. Aluseks kasutati Techempoweri R18 erinevust, millel eemaldati kood CPU tuumade arvu piiramise jaoks (optimeerimine vĂ”imaldas kiirus tĂ”sta 25-27%), GCC kogumine valikutega â-O3â (kasv 5-10%) ja â-march-nativeâ (5-10%), read/write kutsete asendamine recv/send kutsega (5-10%) ning pthreadide kasutamisega seotud kulude vĂ€hendamine (2-3%). Kode optimeerimise pĂ€rast ĂŒldine tĂ”us jĂ”udluses oli 55%, ja lĂ€bilaskevĂ”ime tĂ”usis 224k req/s-st 347k req/s-ni.
- Spetsulatuslike tĂ€ideviimise kaitse funktsioonide keelamine. YTWR-i laadimisparameetrite kasutamine ânospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=offâ vĂ”imaldas jĂ”udlust tĂ”sta 28%, ja lĂ€bilaskevĂ”ime tĂ”usis 347k req/s-st 446k req/s-ni. Ăksikutest parameetritest ânospectre_v1â (Spectre v1 + SWAPGS kaitse) tĂ”us oli 1-2%, ânospectre_v2â (Spectre v2 kaitse) tĂ”usis 15-20%, âpti=offâ (Spectre v3/Meltdown) - 6%, âmds=off tsx_async_abort=offâ (MDS/Zombieload ja TSX Asynchronous Abort) - 6%. Loodud konfiguratsiooniga sobimatud ja jĂ”udlusele mitte mĂ”ju avaldavad L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass ja SRBDS kaitse seadistused jĂ€id muutmata. KVM, sisemiste virtualiseerimise ja teiste CPU mudelite korral.
- Auditmehhanismide ja sĂŒsteemi kutsete blokeerimise keelamine kĂ€suga âauditctl -a never,taskâ ning docker konteineri kĂ€ivitamisel valiku ââsecurity-opt seccomp=unconfinedâ mÀÀramine. Ăldine jĂ”udluse tĂ”us oli 11%, ja lĂ€bilaskevĂ”ime tĂ”usis 446k req/s-st 495k req/s-ni.
- Iptables/netfilter'i keelamine seotud tuumamoodulite laadimise kaudu. Ideed tulemĂŒĂŒri vĂ€lja lĂŒlitamiseks, mida ei kasutatud spetsiifilises serverilahenduses, toetas profiilimise tulemused, mille kohaselt kulus nf_hook_slow funktsiooni tĂ€itmiseks 18% ajast. TĂ€hendatud on, et nftables töötab efektiivsemalt kui iptables, kuid Amazon Linuxis kasutatakse endiselt iptables'i. Iptables'i keelamise jĂ€rel kasvas jĂ”udlus 22%, samas kui lĂ€bilaskevĂ”ime suurenes 495k req/s-lt 603k req/s-le.
- Migratsiooni vĂ€hendamine erinevate CPU tuumade vahel, et tĂ”sta protsessori vahemĂ€lu efektiivset kasutamist. Optimeerimine viidi lĂ€bi nii protsesside libreactor tuumadele kinnitamise (CPU Pinning) kui ka tuuma vĂ”rgu töötlejate kinnitamise (Receive Side Scaling) tasandil. NĂ€iteks keelati irqbalance ja kinnitati jĂ€rjekordade seosed ĂŒhele tuumale /proc/irq/$IRQ/smp_affinity_list failis. Protsessi libreactor ja sissetuleva vĂ”rgu pakettide töötlemiseks kasutati sama CPU tuuma jaoks oma BPF töötlejat, mis aktiveeriti SO_ATTACH_REUSEPORT_CBPF lipu seadistamise kaudu soketi loomisel. VĂ€ljuvate pakettide jĂ€rjekordade kinnitamiseks CPU-le muudeti seadistusi /sys/class/net/eth0/queues/tx-<n>/xps_cpus. Ăldine jĂ”udluse tĂ”us oli 38%, samas kui lĂ€bilaskevĂ”ime suurenes 603k req/s-lt 834k req/s-le.
- Katkestuste töötlemise ja poleerimise (polling) optimeerimine. Adaptivse RX reĆŸiimi aktiveerimine ENA draiveris ja sysctl net.core.busy_read seadistamine aitas tĂ”sta jĂ”udlust 28% (lĂ€bilaskevĂ”ime suurenes 834k req/s-lt 1.06M req/s-le, ja latentsus langes 361ÎŒs-lt 292ÎŒs-le).
- SĂŒsteemiteenuste keelamine, mis pĂ”hjustavad liigseid blokeeringuid vĂ”rgu stack'is. dhclient'i keelamine ja seadistamine IP-aadressid kĂ€sitsi tĂ”i kaasa jĂ”udluse kasvu 6%, samas kui lĂ€bilaskevĂ”ime suurenes 1.06M req/s-lt 1.12M req/s-le. dhclient'i mĂ”ju jĂ”udlusele selgub toorme soketi abil liikluse analĂŒĂŒsimisel.
- Spin Lock'iga vĂ”itlemine. VĂ”rgustiku stack'i ĂŒleviimine "noqueue" reĆŸiimi lĂ€bi sysctl "net.core.default_qdisc=noqueue" ja "tc qdisc replace dev eth0 root mq" tĂ”i kaasa 2% jĂ”udluse kasvu, samas kui lĂ€bilaskevĂ”ime suurenes 1.12M req/s-lt 1.15M req/s-le.
- LĂ”plikud vĂ€iksed optimeerimised, nagu GRO (Generic Receive Offload) vĂ€ljalĂŒlitamine kĂ€suga «ethtool -K eth0 gro off» ja kontrolli algoritmi vahetamine cubicilt renole sysctl abil «net.ipv4.tcp_congestion_control=reno». Ăldine jĂ”udluse kasv oli 4%. LĂ€bivus suurenes 1.15M req/s-lt 1.2M req/s-le.
Lisaks rakendatud optimeerimistele kÀsitleb artikkel ka meetodeid, mis ei toonud oodatud jÔudluse kasvu. NÀiteks osutusid ebaefektiivseteks:
- Erinev libreactori kÀivitamine ei erinenud konteineris kÀitamisest jÔudluse poolest. Kirjutamise asendamine sendiga, maxevents suurendamine epoll_wait-is, GCC versioonide ja lippude katsetamine ei avaldanud mÔju (efekt oli mÀrgatav ainult lippude «-O3» ja «-march-native» puhul).
- Linuxi tuuma uuendamine versioonidele 4.19 ja 5.4 ei mÔjutanud jÔudlust, samas kui SCHED_FIFO ja SCHED_RR planeerijate kasutamine, sysctl muutujaid nagu kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=never, skew_tick=1 ja clocksource=tsc manipuleerimine ei avaldanud mÔju.
- ENA draiveris ei avaldanud Offload-reĆŸiimide (segmenteerimine, scatter-gather, rx/tx checksum) lubamine, -O3 lipu kasutamine ja parameetrite ena.rx_queue_size ning ena.force_large_llq_header rakendamine mĂ”ju.
- VÔrgu hunniku muudatused ei toonud kaasa jÔudluse tÔusu:
- IPv6 vĂ€ljalĂŒlitamine: ipv6.disable=1
- VLAN-i vĂ€ljalĂŒlitamine: modprobe -rv 8021q
- Paketi allika kontrollimise vĂ€ljalĂŒlitamine
- net.ipv4.conf.all.rp_filter=0
- net.ipv4.conf.eth0.rp_filter=0
- net.ipv4.conf.all.accept_local=1 (negatiivne efekt)
- 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
Allikas: opennet.ru
