E detailléierte Guide fir d'Ëmwelt ofzestëmmen ass publizéiert ginn. Linux fir maximal Leeschtung fir d'Veraarbechtung vun HTTP-Ufroen z'erreechen. Déi proposéiert Methoden hunn et eis erméiglecht, d'Leeschtung vum JSON-Parser baséiert op der Libreactor-Bibliothéik an enger Amazon EC2-Ëmfeld (4 vCPUs) vun 224 API-Ufroen pro Sekonn ënner Standard-Amazon-Astellungen ze erhéijen. Linux Versioun 2 mam Kernel 4.14 huet den Duerchgank no der Optimiséierung op 1.2 Millioune Ufroen pro Sekonn erhéicht (eng Erhéijung vun 436%), an och d'Latenz vun der Ufroveraarbechtung ëm 79% reduzéiert. Déi proposéiert Methode sinn net spezifesch fir Libreactor a funktionéieren mat aneren HTTP-Serveren, dorënner nginx, Actix, Netty an Node.js (Libreactor gouf an den Tester benotzt, well d'Léisung baséiert drop eng besser Leeschtung gewisen huet).

Basis Optimisatiounen:
- Optimiséierung vum Libreactor Code. D'R18 Optioun aus dem Techempower Kit gouf als Basis benotzt, déi verbessert gouf andeems de Code ofgeschaaft gouf fir d'Zuel vun de benotzte CPU Cores ze limitéieren (Optimisatioun erlaabt d'Aarbecht ëm 25-27 ze beschleunegen%), d'Versammlung am GCC mat den "-O3" Optiounen (eng Erhéijung vun 5-10%) an "-march-native" (5-10%), ersetzen Lies-/Schreif-Uriff mat recv/send (5-10%) an d'Overhead reduzéieren wann Dir pthreads benotzt (2-3%) . D'Gesamtleeschtungserhéijung no der Codeoptimiséierung war 55%, an den Duerchgang ass vun 224k req/s op 347k req/s eropgaang.
- Deaktivéierung vum Schutz géint Schwachstelle verursaacht duerch spekulativ Ausféierung vun Instruktiounen. Mat der Benotzung vun de Kernel-Bootparameteren "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" gouf d'Performance ëm 28% erhéicht, an den Duerchgank ass vun 347k req/s op 446k req/s eropgaang. Individuell war de Gewënn vum Parameter "nospectre_v1" (Schutz viru Spectre v1 + SWAPGS) 1-2%, "nospectre_v2" (Schutz viru Spectre v2) - 15-20%, "pti=off" (Spectre v3/Meltdown) - 6%, "mds=off tsx_async_abort=off" (MDS/Zombieload an TSX Asynchronous Abort) - 6%. D'Astellungen fir de Schutz géint L1TF/Foreshadow Attacken (l1tf=flush), iTLB Multihit, Speculative Store Bypass an SRBDS, déi d'Performance net beaflosst hunn, goufen onverännert gelooss, well se net mat der getester Konfiguratioun iwwerschratt hunn (zum Beispill si se spezifesch fir KVM, verschachtelte Virtualiséierung an aner CPU-Modeller).
- Desaktivéiere vun Audit a System Call Blocking Mechanismen mat dem Kommando "auditctl -a never,task" a spezifizéiert d'Optioun "--security-opt seccomp=unconfined" beim Start vum Docker Container. D'Gesamtleeschtungserhéijung war 11%, an den Duerchgang ass vu 446k req / s op 495k req / s eropgaang.
- Deaktivéierung vun iptables/netfilter andeems déi associéiert Kernelmoduler erofgeluede ginn. D'Iddi, eng Firewall auszeschalten, déi net an enger spezifescher Serverléisung benotzt gouf, gouf duerch Profilingresultater ausgeléist, déi gewisen hunn, datt d'nf_hook_slow Funktioun 18% vun der Zäit ausgefouert huet. Et gëtt festgestallt, datt nftables méi effizient ass wéi iptables, awer op Amazon Linux iptables gëtt weider benotzt. Nodeems iptables deaktivéiert goufen, ass d'Performance ëm 22% eropgaang, an den Duerchgank ass vu 495k req/s op 603k req/s geklommen.
- Reduzéiert Migratioun vun Handler tëscht verschiddene CPU Cores fir d'Effizienz vum Prozessor Cache Notzung ze verbesseren. Optimisatioun gouf souwuel um Niveau vun de verbindleche Libreaktorprozesser op CPU Cores (CPU Pinning) an duerch Pinning Kernel Netzwierk Handler (Receive Side Scaling) duerchgefouert. Zum Beispill war irqbalance behënnert an d'Schlaangaffinitéit fir d'CPU gouf explizit an /proc/irq/$IRQ/smp_affinity_list gesat. Fir deeselwechten CPU-Kär ze benotzen fir de Libreactor-Prozess an d'Netzschlaang vun erakommen Paketen ze veraarbechten, gëtt e personaliséierte BPF-Handler benotzt, verbonne mat der Astellung vum SO_ATTACH_REUSEPORT_CBPF Fändel beim Schafe vun der Socket. Fir Schlaangen vun erausgaang Paketen un d'CPU ze binden, sinn d'Astellunge /sys/class/net/eth0/queues/tx- geännert ginn /xps_cpus. D'Gesamtleistungserhéijung war 38%, an den Duerchgang ass vu 603k req / s op 834k req / s eropgaang.
- Optimisatioun vun Ënnerbriechung Ëmgank a Gebrauch vun Ëmfro. Aktivéiert den adaptiven-rx Modus am ENA Chauffer a manipuléiert sysctl net.core.busy_read huet d'Performance ëm 28% erhéicht (D'Duerchsatz erhéicht vun 834k req / s op 1.06M req / s, an d'Latenz ass vun 361μs op 292μs erofgaang).
- Systemservicer deaktivéieren, déi onnéideg Netzwierkstack-Sperrunge verursaachen. dhclient deaktivéieren an installéieren IP Adressen D'manuell Ausféierung vun dëser Aufgab huet zu enger Leeschtungserhéijung vu 6% gefouert, woubäi den Duerchsatz vun 1.06 Milliounen Ufuerderungen/s op 1.12 Milliounen Ufuerderungen/s eropgaangen ass. De Grond fir den Impakt vun dhclient op d'Leeschtung ass d'Trafficanalyse mat engem raw Socket.
- Kampf Spin Spär. Den Netzstack op den "noqueue" Modus iwwer sysctl "net.core.default_qdisc = noqueue" an "tc qdisc replace dev eth0 root mq" ëmsetzen, huet zu enger 2% Leeschtungserhéijung gefouert, an den Duerchgang ass vun 1.12M req/s op 1.15M eropgaang. req/s.
- Finale kleng Optimisatiounen, wéi zB deaktivéieren GRO (Generic Receive Offload) mam Kommando "ethtool -K eth0 gro off" an ersetzen de kubesche Staukontrollalgorithmus mat Reno mat sysctl "net.ipv4.tcp_congestion_control=reno". D'Gesamtproduktivitéitserhéijung war 4%. Duerchgang ass vun 1.15M req/s op 1.2M req/s eropgaang.
Zousätzlech zu den Optimisatiounen déi geschafft hunn, diskutéiert den Artikel och Methoden déi net zu der erwaarter Leeschtungserhéijung gefouert hunn. Zum Beispill, déi folgend huet sech als ineffektiv erausgestallt:
- De Libreactor getrennt auszeféieren huet sech net an der Leeschtung ënnerscheet wéi se an engem Container lafen. Ersetzen Writev mat Send, Erhéijung vun maxevents am epoll_wait, an Experimentéiere mat GCC Versiounen a Fändelen hat keen Effekt (den Effekt war just fir d'"-O3" an "-March-native" Fändelen bemierkenswäert).
- Den Kernel-Update huet d'Performance net beaflosst. Linux bis zu de Versiounen 4.19 an 5.4, mat Hëllef vun de Scheduler SCHED_FIFO an SCHED_RR, a Manipulatioun vu sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=never, skew_tick=1 an clocksource=tsc.
- Am ENA Chauffer, aktivéieren Offload Modi (Segmentatioun, scatter-gather, rx / tx checksum), Gebai mat der "-O3" Fändel, a benotzt der ena.rx_queue_size an ena.force_large_llq_header Parameteren huet keen Effekt.
- Ännerungen am Netzstack hunn d'Performance net verbessert:
- IPv6 auszeschalten: ipv6.disable=1
- VLAN auszeschalten: modprobe -rv 8021q
- Desaktivéiere Package Quellkontrolle
- net.ipv4.conf.all.rp_filter=0
- net.ipv4.conf.eth0.rp_filter=0
- net.ipv4.conf.all.accept_local=1 (negativ Effekt)
- 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_PRIORITEIT
- TCP_NODELAY
Source: opennet.ru
