ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ΠΎ Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° Linux ΡΡΠ΅Π΄Π° Ρ ΡΠ΅Π» ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° HTTP Π·Π°ΡΠ²ΠΊΠΈ. ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΡ Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° JSON ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΡΠ°, ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libreactor Π² Amazon EC2 (4 vCPU) ΠΎΡ 224 000 API Π·Π°ΡΠ²ΠΊΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π° ΠΏΡΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π° Amazon Linux 2 Ρ ΡΠ΄ΡΠΎ 4.14 Π΄ΠΎ 1.2 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π·Π°ΡΠ²ΠΊΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π° ΡΠ»Π΅Π΄ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ (ΠΏΠΎΠ²ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΎΡ 436%), ΠΊΠ°ΠΊΡΠΎ ΠΈ Π½Π°ΠΌΠ°Π»ΠΈΡ Π° Π·Π°ΠΊΡΡΠ½Π΅Π½ΠΈΡΡΠ° ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Ρ 79%. ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π½Π΅ ΡΠ° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° libreactor ΠΈ ΡΠ°Π±ΠΎΡΡΡ Ρ Π΄ΡΡΠ³ΠΈ HTTP ΡΡΡΠ²ΡΡΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ nginx, Actix, Netty ΠΈ Node.js (libreactor Π±Π΅ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° Π±Π°Π·Π° ΠΏΠΎΠΊΠ°Π·Π° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ).

ΠΡΠ½ΠΎΠ²Π½ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ:
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° libreactor. ΠΠ°ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π° Π±Π΅ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π²Π°ΡΠΈΠ°Π½Ρ R18 ΠΎΡ Techempower, ΠΊΠΎΠΉΡΠΎ Π±Π΅ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ ΡΡΠ΅Π· ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° Π±ΡΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ CPU ΡΠ΄ΡΠ° (ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ Ρ 25-27%), ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π² GCC Ρ ΠΎΠΏΡΠΈΠΈ "-O3" (ΠΏΠΎΠ²ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΎΡ 5-10%) ΠΈ "-march-native" (5-10%), Π·Π°ΠΌΡΠ½Π° Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ° Π½Π° read/write Ρ recv/send (5-10%) ΠΈ Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° Π½Π°ΠΊΠ»Π°Π΄Π½ΠΈΡΠ΅ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈ ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° pthreads (2-3%). ΠΠ±ΡΠΎΡΠΎ ΠΏΠΎΠ²ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΡΠ»Π΅Π΄ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ΄Π° Π±Π΅ΡΠ΅ 55%, Π° ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π½Π°ΡΠ°ΡΠ½Π° ΠΎΡ 224k req/s Π΄ΠΎ 347k req/s.
- ΠΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΡΠΈΡΠ°ΡΠ° ΡΡΠ΅ΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ, ΠΏΡΠΈΡΠΈΠ½Π΅Π½ΠΈ ΠΎΡ ΡΠΏΠ΅ΠΊΡΠ»Π°ΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΏΡΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ ΠΏΠΎΠ²ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Ρ 28%, Π° ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π½Π°ΡΠ°ΡΠ½Π° ΠΎΡ 347k req/s Π΄ΠΎ 446k req/s. ΠΠΎΠΎΡΠ΄Π΅Π»Π½ΠΎ ΠΏΠΎΠ²ΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° "nospectre_v1" (Π·Π°ΡΠΈΡΠ° ΠΎΡ Spectre v1 + SWAPGS) Π±Π΅ΡΠ΅ 1-2%, "nospectre_v2" (Π·Π°ΡΠΈΡΠ° ΠΎΡ Spectre v2) β 15-20%, "pti=off" (Spectre v3/Meltdown) β 6%, "mds=off tsx_async_abort=off" (MDS/Zombieload ΠΈ TSX ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π΅Π½ Abort) β 6%. ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π·Π° Π·Π°ΡΠΈΡΠ° ΠΎΡ Π°ΡΠ°ΠΊΠΈ L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass ΠΈ SRBDS ΠΎΡΡΠ°Π½Π°Ρ Π° Π±Π΅Π· ΠΏΡΠΎΠΌΡΠ½Π°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡΡ Π° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅ΡΠΈΡΠ°Ρ Π° Ρ ΡΠ΅ΡΡΠ²Π°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° KVM, Π²Π»ΠΎΠΆΠ΅Π½Π° Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ Π΄ΡΡΠ³ΠΈ CPU ΠΌΠΎΠ΄Π΅Π»ΠΈ).
- ΠΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈΡΠ΅ Π·Π° ΠΎΠ΄ΠΈΡ ΠΈ Π±Π»ΠΎΠΊΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΡΠΈ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° "auditctl -a never,task" ΠΈ Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΎΠΏΡΠΈΡΡΠ° "βsecurity-opt seccomp=unconfined" ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠ±ΡΠΎΡΠΎ ΠΏΠΎΠ²ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π±Π΅ΡΠ΅ 11%, Π° ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π½Π°ΡΠ°ΡΠ½Π° ΠΎΡ 446k req/s Π΄ΠΎ 495k req/s.
- ΠΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° iptables/netfilter ΡΡΠ΅Π· Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠ²ΡΡΠ·Π°Π½ΠΈΡΠ΅ Ρ ΡΡΡ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π½Π° ΡΠ΄ΡΠΎΡΠΎ. ΠΠ΄Π΅ΡΡΠ° Π·Π° ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΡΠΈΡΠ½Π°ΡΠ° ΡΡΠ΅Π½Π°, ΠΊΠΎΡΡΠΎ Π½Π΅ Π΅ Π±ΠΈΠ»Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π² ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΎΡΠΎ ΡΡΡΠ²ΡΡΠ½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π±Π΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΈΠΊΠ½Π°ΡΠ° ΠΎΡ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ°Π½Π΅ΡΠΎ, ΡΠΏΠΎΡΠ΅Π΄ ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° nf_hook_slow ΠΎΡΠ½Π΅ΠΌΠ° 18% ΠΎΡ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ. ΠΡΠ±Π΅Π»ΡΠ·Π²Π° ΡΠ΅, ΡΠ΅ nftables ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΎΡ iptables, Π½ΠΎ Π² Amazon Linux Π²ΡΠ΅ ΠΎΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° iptables. Π‘Π»Π΅Π΄ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° iptables, ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π΅ 22%, Π° ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π΅ Π½Π°ΡΠ°ΡΠ½Π°Π»Π° ΠΎΡ 495k req/s Π΄ΠΎ 603k req/s.
- ΠΠ°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ΄ΡΠ° Π½Π° CPU Π·Π° ΠΏΠΎΠ²ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ΅ΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°. ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π±Π΅ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° ΠΊΠ°ΠΊΡΠΎ Π½Π° Π½ΠΈΠ²ΠΎ ΠΏΡΠΈΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ libreactor ΠΊΡΠΌ ΡΠ΄ΡΠ°ΡΠ° Π½Π° CPU (CPU Pinning), ΡΠ°ΠΊΠ° ΠΈ ΡΡΠ΅Π· Π·Π°ΠΊΡΠ΅ΠΏΠ²Π°Π½Π΅ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π½Π° ΡΠ΄ΡΠΎΡΠΎ (Receive Side Scaling). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·Π²ΡΡΡΠ΅Π½ΠΎ Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° irqbalance ΠΈ ΡΠ²Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΏΡΠΈΠ²ΡΡΠ·Π²Π°Π½ΠΈΡΡΠ° Π½Π° ΠΎΠΏΠ°ΡΠΊΠΈΡΠ΅ ΠΊΡΠΌ CPU Π² /proc/irq/$IRQ/smp_affinity_list. ΠΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π΅Π΄Π½ΠΎ ΠΈ ΡΡΡΠΎ ΡΠ΄ΡΠΎ Π½Π° CPU Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° libreactor ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΠΎΠΏΠ°ΡΠΊΠ° Π½Π° Π²Ρ ΠΎΠ΄ΡΡΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ, Π΅ Π°Π½Π³Π°ΠΆΠΈΡΠ°Π½ ΡΠΎΠ±ΡΡΠ²Π΅Π½ BPF-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΡΠ²ΡΡΠ·Π°Π½ ΡΡΠ΅Π· Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ»Π°Π³Π° SO_ATTACH_REUSEPORT_CBPF ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠΊΠ΅ΡΠ°. ΠΠ° ΠΏΡΠΈΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΊΡΠΌ CPU Π½Π° ΠΎΠΏΠ°ΡΠΊΠΈΡΠ΅ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄ΡΡΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° /sys/class/net/eth0/queues/tx-/xps_cpus ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ. ΠΠ±ΡΠΎΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π΅ 38%, Π° ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π΅ Π½Π°ΡΠ°ΡΠ½Π°Π»Π° ΠΎΡ 603k req/s Π΄ΠΎ 834k req/s.
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½ΠΈΡ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ»ΠΈΠ½Π³ (polling). ΠΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ° adaptive-rx Π² Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ENA ΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΠΈΡΠ΅ ΡΡΡ sysctl net.core.busy_read ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π° ΠΏΠΎΠ²ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Ρ 28% (ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π½Π°ΡΠ°ΡΠ½Π° ΠΎΡ 834k req/s Π΄ΠΎ 1.06M req/s, Π° Π»Π°ΡΠ΅Π½ΡΠ½ΠΎΡΡΡΠ° ΡΠΏΠ°Π΄Π½Π° ΠΎΡ 361ΞΌs Π΄ΠΎ 292ΞΌs).
- ΠΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ, Π²ΠΎΠ΄Π΅ΡΠΈ Π΄ΠΎ ΠΈΠ·Π»ΠΈΡΠ½ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π² ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΡΠ΅ΠΊ. ΠΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° dhclient ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° IP Π°Π΄ΡΠ΅ΡΠΈ ΡΡΡΠ½ΠΎ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Ρ 6%, Π° ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π½Π°ΡΠ°ΡΠ½Π° ΠΎΡ 1.06M req/s Π΄ΠΎ 1.12M req/s. ΠΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° Π²Π»ΠΈΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° dhclient Π²ΡΡΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π΅ Π² Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΡΡΠ°ΡΠΈΠΊΠ° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° raw-ΡΠΎΠΊΠ΅ΡΠ°.
- ΠΠΎΡΠ±Π° Ρ Spin Lock. ΠΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΡΠ΅ΠΊ Π² ΡΠ΅ΠΆΠΈΠΌ βnoqueueβ ΡΡΠ΅Π· sysctl βnet.core.default_qdisc=noqueueβ ΠΈ βtc qdisc replace dev eth0 root mqβ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Ρ 2%, Π° ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π½Π°ΡΠ°ΡΠ½Π° ΠΎΡ 1.12M req/s Π΄ΠΎ 1.15M req/s.
- Π€ΠΈΠ½Π°Π»Π½ΠΈΡΠ΅ ΠΌΠ°Π»ΠΊΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠ°ΡΠΎ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° GRO (Generic Receive Offload) Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Β«ethtool -K eth0 gro offΒ» ΠΈ ΡΠΌΡΠ½Π° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π·Π°Π΄ΡΡΡΡΠ²Π°Π½ΠΈΡΡΠ° ΠΎΡ cubic Π½Π° reno Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° sysctl Β«net.ipv4.tcp_congestion_control=renoΒ». ΠΠ±ΡΠΎΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π΅ 4%. ΠΡΠΎΠΏΡΡΠΊΠ°ΡΠ΅Π»Π½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈ ΠΎΡ 1.15M req/s Π΄ΠΎ 1.2M req/s.
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ Π΄ΠΎΠ²Π΅Π΄ΠΎΡ Π° Π΄ΠΎ ΠΎΡΠ°ΠΊΠ²Π°Π½ ΡΠ°ΡΡΠ΅ΠΆ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ ΠΎΠΊΠ°Π·Π°Ρ Π° Π½Π΅Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈ:
- ΠΡΠ΄Π΅Π»Π½ΠΈΡΡ ΡΡΠ°ΡΡ Π½Π° libreactor Π½Π΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°ΡΠ΅ ΠΏΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡ ΡΡΠ°ΡΡΠ° Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ. ΠΡΠΌΠ°ΡΠ΅ Π²Π»ΠΈΡΠ½ΠΈΠ΅ ΠΎΡ ΡΠΌΡΠ½Π°ΡΠ° Π½Π° writev Ρ send, ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° maxevents Π² epoll_wait, Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ΅ Ρ Π²Π΅ΡΡΠΈΠΈΡΠ΅ ΠΈ ΡΠ»Π°Π³ΠΎΠ²Π΅ΡΠ΅ Π½Π° GCC (Π΅ΡΠ΅ΠΊΡΡΡ Π±Π΅ΡΠ΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΠΌ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ»Π°Π³ΠΎΠ²Π΅ΡΠ΅ Β«-O3Β» ΠΈ Β«-march-nativeΒ»).
- ΠΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux Π΄ΠΎ Π²Π΅ΡΡΠΈΠΈ 4.19 ΠΈ 5.4 Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΡΠΈ SCHED_FIFO ΠΈ SCHED_RR, ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΠΈΡΠ΅ Ρ sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=never, skew_tick=1 ΠΈ clocksource=tsc.
- Π Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ENA Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠΈΡΠ΅ Offload (segmentation, scatter-gather, rx/tx checksum), ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΡΠ° Ρ ΡΠ»Π°Π³ Β«-O3Β» ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ena.rx_queue_size ΠΈ ena.force_large_llq_header Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡΡ Π°.
- ΠΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΡΠ΅ΠΊ Π½Π΅ Π΄ΠΎΠ²Π΅Π΄ΠΎΡ
Π° Π΄ΠΎ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°:
- ΠΠ΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° IPv6: ipv6.disable=1
- ΠΠ΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° VLAN: modprobe -rv 8021q
- ΠΠ΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°
- net.ipv4.conf.all.rp_filter=0
- net.ipv4.conf.eth0.rp_filter=0
- net.ipv4.conf.all.accept_local=1 (Π½Π΅Π³Π°ΡΠΈΠ²Π΅Π½ Π΅ΡΠ΅ΠΊΡ)
- 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
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
