ααααα»ααααααααααα’α·αααααΌαααΆαααααα»αααααααΆαααΎααΆαααααααα½αααα·ααΆααΆαααΈαα»α ααΎααααΈαααααα ααΆαααΌαααααα·ααααα·ααΆαα’αα·ααααΆαααααΆααααααΎαααΆαααααΎ 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 ααααΌαααΆαααααΎαααα»αααΆαααααΎαααααααααααααααααααΆαααα’ααααΎααΆαααα αΆαααΈααααΎαααΆααααααΎαααΆααα»α)α
ααΆααααααΎαααααα·αααααΆαααΆααΌαααααΆαα
- αααααΎαααααα·αααααΆαααΌαα’αααααααααααααα·ααΈα αααααΎα R18 ααΈα§ααααα Techempower ααααΌαααΆαααααΎααΆααΌαααααΆα αααααααΌαααΆααααααα’αααααΆαααααΌαα ααααΎααααΈαααααα ααα½αααααΌααααΈααΈααΌαααααΆαααααΎ (ααΆααααααΎαααααα·αααααΆαα’αα»ααααΆαα±αααααααΎαααααΏαααΆαααΆα 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 ααΆαααΆαααααα»α αα·αααα·ααα·αααααΌαααΈααΈααΌαααααααα) α
- ααΆααα·αααααΎαααΆαααααααα αα·αααααααΆααααααααΆααααΆαα α ααΆαααααααααααααααΎααΆααααααααΆ "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 α
- ααΆαααααααααΆαααααΎα αααΆααααα»αααααα§ααααααααααααΆααααΆαααααΌααααΈααΈααΌααααααααααΆ ααΎααααΈαααααΎαααααα·αααααΆαααααΆαααααΎααααΆααααααΆαααααααΆαααααααα½αααααΆαα ααΆααααααΎαααααα·αααααΆαααααΌαααΆαα’αα»ααααααΆαααα ααααα·αααααααΎαααΆα libreactor α αααααΆαααα ααααΌα CPU (CPU Pinning) αα·αααΆααααααΆα pinning network handlers (Receive Side Scaling)α α§ααΆα ααα irqbalance ααααΌαβααΆαβαα·α α αΎαβααΆαβααΆααβααβαα½αβαα βααΉα CPU ααααΌαβααΆαβαααααβαααΆαβα αααΆααβαα βαααα»α /proc/irq/$IRQ/smp_affinity_list α ααΎααααΈααααΎααααΌααααΈααΈααΌααΌα ααααΆααΎααααΈααααΎαααΆαααααΎαααΆα libreactor αα·ααα½ααααααΆααααααα ααααααααΆαα αΌα α§ααααααααααααΆα BPF ααααΆαααααα½αααααΌαααΆαααααΎαααααααΆαααααααΆααααααααα SO_ATTACH_REUSEPORT_CBPF αα ααααααααΎαααααα ααΎααααΈα ααα½ααααααα ααααααααΆαα αααα ααΆαα CPU ααΆαααααα /sys/class/net/eth0/queues/tx- ααααΌαααΆαααααΆααααααΌα /xps_cpu α ααΆαααΎαα‘αΎαααααΆαα’αα»ααααααα»αααΊ 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 αααααΆαααααααΆαα’αα»ααααααΊαα αααα»αααΆααα·ααΆαα ααΆα ααααααααααΎαααααα α
- ααααα»ααααααααΆααααΉαααΆαα αΆαααααααααα·αα ααΆαααααΌαααααααααΆααα ααΆαααα "noqueue" ααΆαααα sysctl "net.core.default_qdisc=noqueue" αα·α "tc qdisc αααα½α 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 ααΆαα½αααΉαααΆαααααΎ ααΆααααααΎαα’αα·ααααΆαα αααα»α 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=clocktever, noteffects.
- αα αααα»ααααααα·ααΈαααααΆ ENA ααΆαααΎαααααΎαααΆα Offload modes (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 = α‘
- 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 = α‘
- SO_PRIORITY
- TCP_NODELAY
ααααα: opennet.ru