ΠΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΡΠ½ΠΈΠ½Π³Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Linux Π΄Π»Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π½ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° JSON Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ libreactor Π² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ Amazon EC2 (4 vCPU) c 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%), Π·Π°ΠΌΠ΅Π½Ρ Π²ΡΠ·ΠΎΠ²ΠΎΠ² 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 Asynchronous 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-<n>/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