ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ืœื™ื ื•ืงืก ืœื˜ื™ืคื•ืœ ื‘-1.2 ืžื™ืœื™ื•ืŸ ื‘ืงืฉื•ืช JSON ื‘ืฉื ื™ื™ื”

ืคื•ืจืกื ืžื“ืจื™ืš ืžืคื•ืจื˜ ื‘ื ื•ืฉื ื›ื•ื•ื ื•ืŸ ืกื‘ื™ื‘ืช ืœื™ื ื•ืงืก ืœื”ืฉื’ืช ื‘ื™ืฆื•ืขื™ื ืžืงืกื™ืžืœื™ื™ื ืœืขื™ื‘ื•ื“ ื‘ืงืฉื•ืช 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 ืฉื™ืžืฉ ื‘ื‘ื“ื™ืงื•ืช ื›ื™ ื”ืคืชืจื•ืŸ ื”ืžื‘ื•ืกืก ืขืœื™ื• ื”ืจืื” ื‘ื™ืฆื•ืขื™ื ื˜ื•ื‘ื™ื ื™ื•ืชืจ).

ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ืœื™ื ื•ืงืก ืœื˜ื™ืคื•ืœ ื‘-1.2 ืžื™ืœื™ื•ืŸ ื‘ืงืฉื•ืช JSON ื‘ืฉื ื™ื™ื”

ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ื‘ืกื™ืกื™ื•ืช:

  • ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ืงื•ื“ ืœื™ื‘ืจืงื˜ื•ืจ. ื”ืื•ืคืฆื™ื” R18 ืžืชื•ืš ืขืจื›ืช Techempower ืฉื™ืžืฉื” ื›ื‘ืกื™ืก, ืืฉืจ ืฉื•ืคืจื” ืขืœ ื™ื“ื™ ื”ืกืจืช ืงื•ื“ ื›ื“ื™ ืœื”ื’ื‘ื™ืœ ืืช ืžืกืคืจ ืœื™ื‘ื•ืช ื”ืžืขื‘ื“ ื‘ืฉื™ืžื•ืฉ (ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืืคืฉืจื” ืœื–ืจื– ืืช ื”ืขื‘ื•ื“ื” ื‘-25-27%), ื”ืจื›ื‘ื” ื‘-GCC ืขื ืืคืฉืจื•ื™ื•ืช "-O3" (ืขืœื™ื™ื” ืฉืœ 5-10% ) ื•-"-March-native" (5-10%), ื”ื—ืœืคืช ืฉื™ื—ื•ืช ืงืจื™ืื”/ื›ืชื™ื‘ื” ื‘-rev/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%, ื•ื”ืชืคื•ืงื” ื’ื“ืœื” ืž-446 ืืœืฃ ื“ืจื™ืฉื•ืช/ืฉื ื™ื•ืช ืœ-495 ืืœืฃ ื“ืจื™ืฉื•ืช/ืฉื ื™ื•ืช.
  • ื”ืฉื‘ืชืช iptables/netfilter ืขืœ ื™ื“ื™ ืคืจื™ืงืช ืžื•ื“ื•ืœื™ ื”ืœื™ื‘ื” ื”ืžืฉื•ื™ื›ื™ื. ื”ืจืขื™ื•ืŸ ืœื”ืฉื‘ื™ืช ืืช ื—ื•ืžืช ื”ืืฉ, ืฉืœื ื”ื™ื” ื‘ืฉื™ืžื•ืฉ ื‘ืคืชืจื•ืŸ ืฉืจืช ืกืคืฆื™ืคื™, ื ื•ืฆืจ ืขืœ ื™ื“ื™ ื™ืฆื™ืจืช ืคืจื•ืคื™ืœื™ื, ืœืคื™ื”ื ืœืงื— ืœืคื•ื ืงืฆื™ื™ืช nf_hook_slow 18% ืžื”ื–ืžืŸ ืœื‘ื™ืฆื•ืข. ื™ืฆื•ื™ืŸ ื›ื™ nftables ืขื•ื‘ื“ ื‘ืฆื•ืจื” ื™ืขื™ืœื” ื™ื•ืชืจ ืžืืฉืจ iptables, ืืš ืืžื–ื•ืŸ ืœื™ื ื•ืงืก ืžืžืฉื™ื›ื” ืœื”ืฉืชืžืฉ ื‘-iptables. ืœืื—ืจ ื”ืฉื‘ืชืช iptables, ื”ืขืœื™ื™ื” ื‘ื‘ื™ืฆื•ืขื™ื ื”ื™ื™ืชื” 22%, ื•ื”ืชืคื•ืงื” ื’ื“ืœื” ืž-495k req/s ืœ-603k req/s.
  • ื”ื’ื™ืจื” ืžื•ืคื—ืชืช ืฉืœ ืžื˜ืคืœื™ื ื‘ื™ืŸ ืœื™ื‘ื•ืช CPU ืฉื•ื ื•ืช ื›ื“ื™ ืœืฉืคืจ ืืช ื”ื™ืขื™ืœื•ืช ืฉืœ ื”ืฉื™ืžื•ืฉ ื‘ืžื˜ืžื•ืŸ ื”ืžืขื‘ื“. ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื‘ื•ืฆืขื” ื”ืŸ ื‘ืจืžืช ืงืฉื™ืจืช ืชื”ืœื™ื›ื™ ื”ืžืฉื—ืจืจ ืœืœื™ื‘ื•ืช CPU (CPU Pinning) ื•ื”ืŸ ื‘ืืžืฆืขื•ืช ื”ืฆืžื“ืช ืžื˜ืคืœื™ ืจืฉืช ืœื™ื‘ื” (Receive Side Scaling). ืœื“ื•ื’ืžื”, irqbalance ื”ื•ืฉื‘ืชื” ื•ื–ื™ืงืช โ€‹โ€‹ื”ืชื•ืจ ืœืžืขื‘ื“ ื”ื•ื’ื“ืจื” ื‘ืžืคื•ืจืฉ ื‘-/proc/irq/$IRQ/smp_affinity_list. ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ืื•ืชื” ืœื™ื‘ืช CPU ื›ื“ื™ ืœืขื‘ื“ ืืช ืชื”ืœื™ืš ื”-Libreactor ื•ืืช ืชื•ืจ ื”ืจืฉืช ืฉืœ ืžื ื•ืช ื ื›ื ืกื•ืช, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืžื˜ืคืœ BPF ืžื•ืชืื ืื™ืฉื™ืช, ื”ืžื—ื•ื‘ืจ ืขืœ ื™ื“ื™ ื”ื’ื“ืจืช ื”ื“ื’ืœ SO_ATTACH_REUSEPORT_CBPF ื‘ืขืช ื™ืฆื™ืจืช ื”ืฉืงืข. ื›ื“ื™ ืœืื’ื“ ืชื•ืจื™ื ืฉืœ ืžื ื•ืช ื™ื•ืฆืื•ืช ืœืžืขื‘ื“, ื”ื”ื’ื“ืจื•ืช /sys/class/net/eth0/queues/tx-/xps_cpus ืฉื•ื ื•. ืขืœื™ื™ืช ื”ื‘ื™ืฆื•ืขื™ื ื”ื›ื•ืœืœืช ื”ื™ื™ืชื” 38%, ื•ื”ืชืคื•ืงื” ื’ื“ืœื” ืž-603 ื“ืจื™ืฉื•ืช/ืฉื ื™ื•ืช ืœ-834 ื“ืจื™ืฉื•ืช/ืฉื ื™ื•ืช.
  • ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ื˜ื™ืคื•ืœ ื‘ืคืกื™ืงื•ืช ื•ืฉื™ืžื•ืฉ ื‘ืกืงืจ. ื”ืคืขืœืช ืžืฆื‘ ื”-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 ืžืฉืคื™ืข ืขืœ ื”ื‘ื™ืฆื•ืขื™ื ื”ื™ื ื‘ื ื™ืชื•ื— ืชืขื‘ื•ืจื” ื‘ืืžืฆืขื•ืช ืฉืงืข ื’ื•ืœืžื™.
  • Fighting Spin Lock. ื”ืขื‘ืจืช ืขืจื™ืžืช ื”ืจืฉืช ืœืžืฆื‘ "noqueue" ื‘ืืžืฆืขื•ืช sysctl "net.core.default_qdisc=noqueue" ื•-"tc qdisc replace dev eth0 root mq" ื”ื•ื‘ื™ืœื” ืœืขืœื™ื™ื” ืฉืœ 2% ื‘ื‘ื™ืฆื•ืขื™ื, ื•ื”ืชืคื•ืงื” ื’ื“ืœื” ืž-1.12M req/s ืœ-1.15M ื“ืจื™ืฉื”/ื™ื.
  • ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ืงืœื•ืช ืื—ืจื•ื ื•ืช, ื›ื’ื•ืŸ ื”ืฉื‘ืชืช 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").
  • ืฉื“ืจื•ื’ ืœื™ื‘ืช ืœื™ื ื•ืงืก ืœื’ื™ืจืกืื•ืช 4.19 ื•-5.4, ื‘ืืžืฆืขื•ืช ืžืชื–ืžื ื™ SCHED_FIFO ื•-SCHED_RR, ืžื ื™ืคื•ืœืฆื™ื” ืฉืœ sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=never, skew_tick=t=1 ื•ื‘ื™ืฆื•ืขื™ ืฉืขื•ืŸ ืœื ื”ืฉืคื™ืขื•.
  • ื‘ืžื ื”ืœ ื”ื”ืชืงืŸ ืฉืœ ENA, ื”ืคืขืœืช ืžืฆื‘ื™ Offload (ืคื™ืœื•ื—, ืคื™ื–ื•ืจ-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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”