ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Linux для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 1.2 ΠΌΠ»Π½ JSON-запросов Π² сСкунду

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ руководство ΠΏΠΎ Ρ‚ΡŽΠ½ΠΈΠ½Π³Ρƒ окруТСния 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 использовался Π² тСстах, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Π΅Π³ΠΎ основС ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ).

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Linux для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 1.2 ΠΌΠ»Π½ JSON-запросов Π² сСкунду

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ:

  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠ΄Π° 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