ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ΠΎ Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Linux ΡΡΠ΅Π΄Π°ΡΠ° Π·Π° ΠΏΠΎΡΡΠΈΠ³Π°Π½Π΅ Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° HTTP Π·Π°ΡΠ²ΠΊΠΈ. ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π° Π΄Π° ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° JSON ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libreactor Π² ΡΡΠ΅Π΄Π°ΡΠ° Π½Π° Amazon EC2 (4 vCPU) ΠΎΡ 224 Ρ ΠΈΠ»ΡΠ΄ΠΈ 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%), Π·Π°ΠΌΠ΅Π½ΡΠΉΠΊΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ° Π·Π° ΡΠ΅ΡΠ΅Π½Π΅/Π·Π°ΠΏΠΈΡ Ρ 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 Asynchronous Abort) - 6%. ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π·Π° Π·Π°ΡΠΈΡΠ° ΡΡΠ΅ΡΡ L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass ΠΈ SRBDS Π°ΡΠ°ΠΊΠΈ Π±ΡΡ Π° ΠΎΡΡΠ°Π²Π΅Π½ΠΈ Π½Π΅ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π½Π΅ ΡΠ΅ ΠΎΡΡΠ°Π·ΠΈ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅ΡΠΈΡΠ°Ρ Π° Ρ ΡΠ΅ΡΡΠ²Π°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° KVM, Π²Π»ΠΎΠΆΠ΅Π½ΠΈ Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ Π΄ΡΡΠ³ΠΈ CPU ΠΌΠΎΠ΄Π΅Π»ΠΈ).
- ΠΠ΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈΡΠ΅ Π·Π° ΠΎΠ΄ΠΈΡ ΠΈ Π±Π»ΠΎΠΊΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° "auditctl -a never,task" ΠΈ ΡΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΎΠΏΡΠΈΡΡΠ° "--security-opt seccomp=unconfined" ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠ±ΡΠΎΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π±Π΅ΡΠ΅ 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.
- ΠΠ°ΠΌΠ°Π»Π΅Π½Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π½Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ½ΠΈ ΡΠ΄ΡΠ° Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ΅ΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°. ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π±Π΅ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ΅Π½Π° ΠΊΠ°ΠΊΡΠΎ Π½Π° Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π½Π° libreactor ΠΊΡΠΌ ΡΠ΄ΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ° (CPU Pinning), ΡΠ°ΠΊΠ° ΠΈ ΡΡΠ΅Π· ΡΠΈΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠΈ Π½Π° ΡΠ΄ΡΠΎΡΠΎ (Receive Side Scaling). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ irqbalance Π±Π΅ΡΠ΅ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ ΠΈ Π°ΡΠΈΠ½ΠΈΡΠ΅ΡΡΡ Π½Π° ΠΎΠΏΠ°ΡΠΊΠ°ΡΠ° ΠΊΡΠΌ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ° Π±Π΅ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ Π² /proc/irq/$IRQ/smp_affinity_list. ΠΠ° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΅Π΄Π½ΠΎ ΠΈ ΡΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ½ΠΎ ΡΠ΄ΡΠΎ ββΠ·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° libreactor ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΠΎΠΏΠ°ΡΠΊΠ° ΠΎΡ Π²Ρ ΠΎΠ΄ΡΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡ Π½Π° BPF, ΡΠ²ΡΡΠ·Π°Π½ ΡΡΠ΅Π· Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ»Π°Π³Π° SO_ATTACH_REUSEPORT_CBPF ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠΊΠ΅ΡΠ°. ΠΠ° Π΄Π° ΡΠ΅ ΠΎΠ±Π²ΡΡΠΆΠ°Ρ ΠΎΠΏΠ°ΡΠΊΠΈ ΠΎΡ ΠΈΠ·Ρ ΠΎΠ΄ΡΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΊΡΠΌ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ /sys/class/net/eth0/queues/tx-/xps_cpus ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ. ΠΠ±ΡΠΎΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π±Π΅ΡΠ΅ 38%, Π° ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΠ΅Π»Π½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈ ΠΎΡ 603k req/s Π½Π° 834k req/s.
- ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½ΠΈΡΡΠ° ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π°Π½ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅. ΠΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ° 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 Π²Π»ΠΈΡΠ΅ Π²ΡΡΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°, Π΅ Π² Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΡΡΠ°ΡΠΈΠΊΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π½Π΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½ ΡΠΎΠΊΠ΅Ρ.
- ΠΠΎΡΠ±Π° ΡΡΡ 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β ΠΈ Π·Π°ΠΌΡΠ½Π° Π½Π° ΠΊΡΠ±ΠΈΡΠ½ΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π·Π°Π΄ΡΡΡΡΠ²Π°Π½ΠΈΡΡΠ° Ρ reno, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ sysctl βnet.ipv4.tcp_congestion_control=renoβ. ΠΠ±ΡΠΎΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π΅ 4%. ΠΡΠΎΠΏΡΡΠΊΠ°ΡΠ΅Π»Π½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½Π° ΠΎΡ 1.15M req/s Π½Π° 1.2M req/s.
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΡΠ°Π±ΠΎΡΠΈΠ»ΠΈ, ΡΡΠ°ΡΠΈΡΡΠ° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΎΠ±ΡΡΠΆΠ΄Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° Π΄ΠΎΠ²Π΅Π»ΠΈ Π΄ΠΎ ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΎΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ ΡΠ΅ ΠΎΠΊΠ°Π·Π° Π½Π΅Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ:
- Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° libreactor ΠΎΡΠ΄Π΅Π»Π½ΠΎ Π½Π΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΠΏΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΌΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ. ΠΠ°ΠΌΡΠ½Π°ΡΠ° Π½Π° writev Ρ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅, ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° 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 Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠΈ Π½Π° ΡΠ°Π·ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ (ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π΅, ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·ΡΠ΅ΠΉΠ²Π°Π½Π΅, ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π° ΡΡΠΌΠ° Π½Π° rx/tx), ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Ρ ΡΠ»Π°Π³Π° β-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