Publikuar një udhëzues të detajuar për përshtatjen e ambientit Linux për arritjen e performancës maksimale në përpunimin e kërkesave HTTP. Metodat e propozuara lejuan ngritjen e performancës së handler-it JSON të bazuar në bibliotekën libreactor në ambientin Amazon EC2 (4 vCPU) nga 224 mijë kërkesa API në sekondë me konfigurime standarde të Amazon Linux 2 me bërthamën 4.14 në 1.2 milion kërkesa në sekondë pas optimizimit (rritje prej 436%), si dhe çuan në reduktimin e vonesave gjatë përpunimit të kërkesave me 79%. Metodat e propozuara nuk janë specifike për libreactor dhe funksionojnë me përdorimin e serverëve të tjerë http, përfshirë nginx, Actix, Netty dhe Node.js (libreactor u përdor në testime, pasi zgjidhja e bazuar në të tregoi performancën më të mirë).

Optimizimet kryesore:
- Optimizimi i kodit libreactor. Si bazë është përdorur varianti R18 nga seti Techempower, i cili është përmirësuar duke eliminuar kodin për të kufizuar numrin e thellimeve të përdorura të CPU (optimizimi ka lejuar përshpejtimin e punës me 25-27%), ndërtimi në GCC me opsionet «-O3» (rritje 5-10%) dhe «-march-native» (5-10%), zëvendësimin e thirrjeve read/write me recv/send (5-10%) dhe uljen e kostove gjatë përdorimit të pthreads (2-3%). Rritja totale e performancës pas optimizimit të kodit është 55%, ndërsa kapaciteti kalimtar është rritur nga 224k req/s në 347k req/s.
- Ăaktivizimi i mbrojtjes nga dobĂ«sitĂ« qĂ« shkaktohen nga ekzekutimi spekulativ i instrukcioneve. PĂ«rdorimi i parametrave nĂ« ngarkimin e kernelit "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" lehtĂ«soi njĂ« rritje tĂ« performancĂ«s prej 28%, me kapacitetin e kĂ«rkesave qĂ« rritet nga 347k req/s nĂ« 446k req/s. NdĂ«rveprimi nga parametri "nospectre_v1" (mbrojtjeje nga Spectre v1 + SWAPGS) ishte 1-2%, "nospectre_v2" (mbrojtje nga Spectre v2) â 15-20%, "pti=off" (Spectre v3/Meltdown) â 6%, "mds=off tsx_async_abort=off" (MDS/Zombieload dhe TSX Asynchronous Abort) â 6%. JanĂ« lĂ«nĂ« tĂ« pandryshuara cilĂ«simet pĂ«r mbrojtjen nga sulmet L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass dhe SRBDS, tĂ« cilat nuk ndikonin nĂ« performancĂ«, pasi nuk pĂ«rputheshin me konfigurimin e testuar (p.sh., specifik pĂ«r KVM, virtualizimin e brendshĂ«m dhe modelet e tjera tĂ« CPU).
- Ăaktivizimi i mekanizmave tĂ« auditimit dhe bllokimit tĂ« thirrjeve sistemore pĂ«rmes urdhrit "auditctl -a never,task" dhe caktimin e opsionit "âsecurity-opt seccomp=unconfined" gjatĂ« nisjes sĂ« enĂ«s docker. Rritja totale e performancĂ«s ishte 11%, me kapacitetin e kĂ«rkesave qĂ« u rrit nga 446k req/s nĂ« 495k req/s.
- Ăaktivizimi i iptables/netfilter pĂ«rmes shkarkimit tĂ« moduleve tĂ« lidhura tĂ« bĂ«rthamĂ«s. Ideja pĂ«r tĂ« çaktivizuar firewall-in, i cili nuk pĂ«rdorej nĂ« zgjidhjen specifike tĂ« serverit, u nxit nga rezultatet e profilizimit, sipas tĂ« cilave funksioni nf_hook_slow merrte 18% tĂ« kohĂ«s. Vlen tĂ« theksohet se nftables funksionon mĂ« efektivisht se iptables, por nĂ« Amazon Linux vazhdon tĂ« pĂ«rdoret iptables. Pas çaktivizimit tĂ« iptables, rritja e performancĂ«s ishte 22%, ndĂ«rsa kapaciteti kaloi nga 495k req/s nĂ« 603k req/s.
- Reduktimi i migrimit të menaxhuesve midis bërthamave të ndryshme CPU për të rritur efikasitetin e përdorimit të caches të procesorëve. Optimizimi u krye si në nivelin e lidhjes së proceseve libreactor me bërthamat e CPU (CPU Pinning), ashtu edhe përmes fijes së menaxhuesve të rrjetit në bërthamë (Receive Side Scaling). Për shembull, u çaktivizua irqbalance dhe u vendosën qartë lidhjet e radhëve me CPU në /proc/irq/$IRQ/smp_affinity_list. Për të përdorur të njëjtën bërthamë CPU për procesin libreactor dhe radhën e paketave hyrëse, u angazhua një menaxhues BPF i veçantë, i lidhur përmes vendosjes së flamurit SO_ATTACH_REUSEPORT_CBPF gjatë krijimit të soketit. Për lidhjen e CPU-së së radhëve të paketave dalëse, u ndryshuan konfigurimet në /sys/class/net/eth0/queues/tx-<n>/xps_cpus. Rritja totale e performancës ishte 38%, ndërsa kapaciteti kaloi nga 603k req/s në 834k req/s.
- Optimizimi i pĂ«rpunimit tĂ« ndĂ«rprerjeve dhe pĂ«rdorimi i polling. Aktivizimi i modit adaptive-rx nĂ« driverin ENA dhe manipulimet me sysctl net.core.busy_read lejuan ngritjen e performancĂ«s me 28% (kapaciteti u rrit nga 834k req/s nĂ« 1.06M req/s, ndĂ«rsa vonesat u ulĂ«n nga 361ÎŒs nĂ« 292ÎŒs).
- Ăaktivizimi i shĂ«rbimeve sistemore qĂ« çojnĂ« nĂ« bllokime tĂ« panevojshme nĂ« strukturĂ«n e rrjetit. Ăaktivizimi i dhclient dhe vendosja adresat IP me dorĂ« e rriti performancĂ«n me 6%, ndĂ«rsa kapaciteti kaloi nga 1.06M req/s nĂ« 1.12M req/s. Arsyeja e ndikimit tĂ« dhclient nĂ« performancĂ« Ă«shtĂ« analizuar duke pĂ«rdorur soket tĂ« papĂ«rpunuar.
- Lufta me Spin Lock. Kalimi i strukturës së rrjetit në modalitetin «noqueue» përmes sysctl «net.core.default_qdisc=noqueue» dhe «tc qdisc replace dev eth0 root mq» solli një rritje të performancës me 2%, dhe kapaciteti kaloi nga 1.12M req/s në 1.15M req/s.
- Optimizimet përfundimtare të vogla, siç janë çaktivizimi i GRO (Generic Receive Offload) me komandën «ethtool -K eth0 gro off» dhe zëvendësimi i algoritmit të kontrollit të ngarkesës cubic me reno përmes sysctl «net.ipv4.tcp_congestion_control=reno». Rritja totale e performancës ishte 4%. Kapaciteti kaloi nga 1.15M req/s në 1.2M req/s.
Përveç optimizimeve të realizuara, artikulli gjithashtu shqyrton metoda që nuk çuan në rritjen e pritur të performancës. Për shembull, ato që u treguan të pasuksesshme ishin:
- Një nisje e veçantë e libreactor nuk ndryshoi në performancë nga nisja në kontejner. Nuk kishte ndikim zëvendësimi i writev me send, rritja e maxevents në epoll_wait, eksperimentet me versionet dhe flagjet e GCC (efekti ishte i dukshëm vetëm për flagjet «-O3» dhe «-march-native»).
- Update-i i bërthamës Linux në versionet 4.19 dhe 5.4 nuk ndikoi në performancë, përdorimi i planifikuesve SCHED_FIFO dhe SCHED_RR, manipulimet me sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=never, skew_tick=1 dhe clocksource=tsc.
- Në drejtuesin ENA, aktivizimi i mënyrave Offload (segmentation, scatter-gather, rx/tx checksum), ndërtimi me flagun «-O3» dhe aplikimi i parametrave ena.rx_queue_size dhe ena.force_large_llq_header nuk patën ndikim.
- Ndryshimet në stek-in e rrjetit nuk çuan në rritjen e performancës:
- Ăaktivizimi i IPv6: ipv6.disable=1
- Ăaktivizimi i VLAN: modprobe -rv 8021q
- Ăaktivizimi i verifikimit tĂ« burimit tĂ« paketave
- net.ipv4.conf.all.rp_filter=0
- net.ipv4.conf.eth0.rp_filter=0
- net.ipv4.conf.all.accept_local=1 (efekti negativ)
- 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
Burimi: opennet.ru
