Ir publicÄts detalizÄts ceļvedis par Linux vides regulÄÅ”anu, lai sasniegtu maksimÄlu HTTP pieprasÄ«jumu apstrÄdes veiktspÄju. PiedÄvÄtÄs metodes ļÄva palielinÄt JSON procesora veiktspÄju, pamatojoties uz libreactor bibliotÄku Amazon EC2 vidÄ (4 vCPU) no 224 tÅ«kstoÅ”iem API pieprasÄ«jumu sekundÄ ar Amazon Linux 2 standarta iestatÄ«jumiem ar kodolu 4.14 lÄ«dz 1.2 miljoniem pieprasÄ«jumu vienÄ otrajÄ vietÄ pÄc optimizÄcijas (pieaugums par 436%), kÄ arÄ« samazinÄja pieprasÄ«jumu apstrÄdes kavÄjumus par 79%. PiedÄvÄtÄs metodes nav specifiskas libreactor un darbojas, izmantojot citus http serverus, tostarp nginx, Actix, Netty un Node.js (testos tika izmantots libreactor, jo uz tÄ balstÄ«tais risinÄjums uzrÄdÄ«ja labÄku veiktspÄju).
Pamata optimizÄcijas:
- Librektora koda optimizÄÅ”ana. Par pamatu tika izmantota R18 opcija no Techempower komplekta, kas tika uzlabota, noÅemot kodu, lai ierobežotu izmantoto CPU kodolu skaitu (optimizÄcija ļÄva paÄtrinÄt darbu par 25-27%), montÄjot GCC ar opcijÄm ā-O3ā (pieaugums par 5-10%) un "-march-native" (5-10%), aizstÄjot lasÄ«Å”anas/rakstÄ«Å”anas zvanus ar recv/send (5-10%) un samazinot pieskaitÄmÄs izmaksas, izmantojot pthreads (2-3%). . KopÄjais veiktspÄjas pieaugums pÄc koda optimizÄcijas bija 55%, un caurlaidspÄja palielinÄjÄs no 224k req/s lÄ«dz 347k req/s.
- AtspÄjot aizsardzÄ«bu pret spekulatÄ«vas izpildes ievainojamÄ«bu. Parametru ānospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=offā izmantoÅ”ana kodola ielÄdes laikÄ Ä¼Äva palielinÄt veiktspÄju par 28%, un caurlaidspÄja palielinÄjÄs no 347k req/s lÄ«dz 446k req/s. AtseviŔķi palielinÄjums no parametra ānospectre_v1ā (aizsardzÄ«ba no Spectre v1 + SWAPGS) bija 1-2%, ānospectre_v2ā (aizsardzÄ«ba no Spectre v2) - 15-20%, "pti=off" (Spectre v3/Meltdown) - 6%, "mds=off tsx_async_abort=off" (MDS/Zombieload un TSX asinhronÄ pÄrtraukÅ”ana) - 6%. IestatÄ«jumi aizsardzÄ«bai pret L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass un SRBDS uzbrukumiem tika atstÄti nemainÄ«gi, kas neietekmÄja veiktspÄju, jo tie nekrustojas ar pÄrbaudÄ«to konfigurÄciju (piemÄram, specifiski KVM, ligzdots virtualizÄcija un citi CPU modeļi).
- AuditÄÅ”anas un sistÄmas izsaukumu bloÄ·ÄÅ”anas mehÄnismu atspÄjoÅ”ana, izmantojot komandu "auditctl -a never,task" un norÄdot opciju "--security-opt seccomp=unconfined", startÄjot docker konteineru. KopÄjais veiktspÄjas pieaugums bija par 11%, un caurlaidspÄja palielinÄjÄs no 446 495 rekv/s lÄ«dz XNUMX XNUMX req/s.
- Iptables/netfilter atspÄjoÅ”ana, izkraujot saistÄ«tos kodola moduļus. Ideju atslÄgt ugunsmÅ«ri, kas netika izmantots konkrÄtÄ servera risinÄjumÄ, rosinÄja profilÄÅ”anas rezultÄti, pÄc kuriem spriežot, funkcijas nf_hook_slow izpilde aizÅÄma 18% laika. Tiek atzÄ«mÄts, ka nftables darbojas efektÄ«vÄk nekÄ iptables, taÄu Amazon Linux turpina izmantot iptables. PÄc iptable atspÄjoÅ”anas veiktspÄjas pieaugums bija 22%, un caurlaidspÄja palielinÄjÄs no 495 603 rekv/s lÄ«dz XNUMX XNUMX req/s.
- SamazinÄta apstrÄdÄtÄju migrÄcija starp dažÄdiem CPU kodoliem, lai uzlabotu procesora keÅ”atmiÅas izmantoÅ”anas efektivitÄti. OptimizÄcija tika veikta gan libreactor procesu saistÄ«Å”anas lÄ«menÄ« ar CPU kodoliem (CPU Pinning), gan izmantojot kodola tÄ«kla apdarinÄtÄju piesprauÅ”anu (Receive Side Scaling). PiemÄram, irqbalance tika atspÄjota, un rindÄ /proc/irq/$IRQ/smp_affinity_list tika skaidri iestatÄ«ta rindas afinitÄte pret centrÄlo procesoru. Lai izmantotu vienu un to paÅ”u CPU kodolu, lai apstrÄdÄtu libreactor procesu un ienÄkoÅ”o pakeÅ”u tÄ«kla rindu, tiek izmantots pielÄgots BPF apdarinÄtÄjs, kas savienots, ligzdas izveides laikÄ iestatot karogu SO_ATTACH_REUSEPORT_CBPF. Lai saistÄ«tu izejoÅ”o pakeÅ”u rindas ar centrÄlo procesoru, ir mainÄ«ti iestatÄ«jumi /sys/class/net/eth0/queues/tx- /xps_cpus. KopÄjais veiktspÄjas pieaugums bija 38%, un caurlaidspÄja palielinÄjÄs no 603 834 rekv/s lÄ«dz XNUMX XNUMX rekv/s.
- PÄrtraukumu apstrÄdes un aptaujas izmantoÅ”anas optimizÄcija. IespÄjojot adaptÄ«vÄ-rx režīmu ENA draiverÄ« un manipulÄjot ar sysctl net.core.busy_read, veiktspÄja palielinÄjÄs par 28% (caurlaidspÄja palielinÄjÄs no 834 1.06 req/s lÄ«dz 361 M req/s, un latentums samazinÄjÄs no 292 Ī¼s lÄ«dz XNUMX Ī¼s).
- SistÄmas pakalpojumu atspÄjoÅ”ana, kas izraisa nevajadzÄ«gu tÄ«kla steka bloÄ·ÄÅ”anu. AtspÄjojot dhclient un manuÄli iestatot IP adresi, veiktspÄja palielinÄjÄs par 6%, un caurlaidspÄja palielinÄjÄs no 1.06 M req/s lÄ«dz 1.12 M req/s. Iemesls, kÄpÄc dhclient ietekmÄ veiktspÄju, ir trafika analÄ«ze, izmantojot neapstrÄdÄtu ligzdu.
- CÄ«Åa ar Spin Lock. PÄrslÄdzot tÄ«kla steku uz ānoqueueā režīmu, izmantojot sysctl ānet.core.default_qdisc=noqueueā un ātc qdisc aizstÄt dev eth0 root mqā, veiktspÄja palielinÄjÄs par 2%, un caurlaidspÄja palielinÄjÄs no 1.12 miljoniem req/s lÄ«dz 1.15 miljoniem. pras./s.
- PÄdÄjÄs nelielas optimizÄcijas, piemÄram, GRO (Generic Receive Offload) atspÄjoÅ”ana ar komandu āethtool -K eth0 gro offā un kubiskÄ pÄrslodzes kontroles algoritma aizstÄÅ”ana ar reno, izmantojot sysctl ānet.ipv4.tcp_congestion_control=renoā. KopÄjais produktivitÄtes pieaugums bija 4%. Caurlaide palielinÄjÄs no 1.15 miljoniem rekv/s lÄ«dz 1.2 miljoniem rekv./s.
Papildus optimizÄcijÄm, kas darbojÄs, rakstÄ ir apskatÄ«tas arÄ« metodes, kas nesniedza gaidÄ«to veiktspÄjas pieaugumu. PiemÄram, Å”Ädi pasÄkumi izrÄdÄ«jÄs neefektÄ«vi:
- Palaižot libreactor atseviŔķi, veiktspÄja neatŔķīrÄs no tÄ darbinÄÅ”anas konteinerÄ. Writev aizstÄÅ”anai ar send, maxevents palielinÄÅ”anai epoll_wait un eksperimentÄÅ”anai ar GCC versijÄm un karodziÅiem nebija nekÄdas ietekmes (efekts bija pamanÄms tikai karodziÅiem ā-O3ā un ā-march-nativeā).
- Linux kodola jauninÄÅ”ana uz versijÄm 4.19 un 5.4, izmantojot SCHED_FIFO un SCHED_RR plÄnotÄjus, manipulÄjot ar sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=never, skew_tick=tc un neietekmÄja veiktspÄju.
- ENA draiverÄ« izkrauÅ”anas režīmu iespÄjoÅ”ana (segmentÄÅ”ana, izkliedÄÅ”ana, rx/tx kontrolsumma), veidoÅ”ana ar karogu ā-O3ā un parametru ena.rx_queue_size un ena.force_large_llq_header izmantoÅ”ana nedeva nekÄdu efektu.
- IzmaiÅas tÄ«kla stekÄ neuzlaboja veiktspÄju:
- AtspÄjot IPv6: ipv6.disable=1
- AtspÄjot VLAN: modprobe -rv 8021q
- AtspÄjot pakotnes avota pÄrbaudi
- net.ipv4.conf.all.rp_filter=0
- net.ipv4.conf.eth0.rp_filter=0
- net.ipv4.conf.all.accept_local=1 (negatīvs efekts)
- 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_PRIORITÄTE
- TCP_NODELAY
Avots: opennet.ru