Optimize Linux pou okipe 1.2 milyon demann JSON pou chak segonn

Yo te pibliye yon gid detaye sou ajiste anviwònman Linux pou reyalize maksimòm pèfòmans pou trete demann HTTP. Metòd yo pwopoze yo te fè li posib pou ogmante pèfòmans processeur JSON ki baze sou bibliyotèk libreactor nan anviwònman Amazon EC2 (4 vCPU) soti nan 224 mil demann API pou chak segonn ak anviwònman estanda Amazon Linux 2 ak nwayo 4.14 a 1.2 milyon demann pou chak. dezyèm apre optimize (yon ogmantasyon de 436%), epi tou li te mennen nan yon rediksyon nan reta nan demann pwosesis pa 79%. Metòd yo pwopoze yo pa espesifik nan libreactor ak travay lè w ap itilize lòt serveurs http, ki gen ladan nginx, Actix, Netty ak Node.js (libreactor yo te itilize nan tès yo paske solisyon an ki baze sou li te montre pi bon pèfòmans).

Optimize Linux pou okipe 1.2 milyon demann JSON pou chak segonn

Optimize debaz:

  • Optimize kòd libreactor. Opsyon R18 ki soti nan twous Techempower la te itilize kòm yon baz, ki te amelyore lè yo retire kòd pou limite kantite nwayo CPU yo itilize (optimizasyon pèmèt travay pi vit nan 25-27%), rasanble nan GCC ak opsyon "-O3" yo. (yon ogmantasyon de 5-10%) ak "-march-native" (5-10%), ranplase lekti/ekri apèl ak recv/send (5-10%) ak diminye anlè lè w ap itilize pthreads (2-3%) . Ogmantasyon an jeneral pèfòmans apre optimize kòd la te 55%, ak debi ogmante soti nan 224k req / s a ​​347k req / s.
  • Enfim pwoteksyon kont frajilite egzekisyon spéculatif. Sèvi ak paramèt yo "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" lè chaje nwayo a pèmèt ogmante pèfòmans pa 28%, ak debi ogmante soti nan 347k req/s a 446k req/s. Separeman, ogmantasyon nan paramèt "nospectre_v1" (pwoteksyon nan Spectre v1 + SWAPGS) te 1-2%, "nospectre_v2" (pwoteksyon soti nan Spectre v2) - 15-20%, "pti = off" (Spectre v3/Meltdown) - 6%, "mds=off tsx_async_abort=off" (MDS/Zombieload ak TSX Asynchrone Abort) - 6%. Anviwònman yo pou pwoteksyon kont L1TF/Foreshadow (l1tf = flush), iTLB multihit, Speculative Store Bypass ak SRBDS atak yo te rete san okenn chanjman, ki pa te afekte pèfòmans paske yo pa t kwaze ak konfigirasyon tès la (pa egzanp, espesifik nan KVM, enbrike). Virtualization ak lòt modèl CPU).
  • Enfim odit ak mekanis bloke sistèm apèl yo lè l sèvi avèk kòmandman "auditctl -a never,task" epi presize opsyon "--security-opt seccomp=unconfined" lè w kòmanse veso docker la. Ogmantasyon an jeneral pèfòmans te 11%, ak debi ogmante soti nan 446k req / s a ​​495k req / s.
  • Enfim iptables/netfilter pa dechaje modil nwayo ki asosye yo. Lide a enfim firewall la, ki pa te itilize nan yon solisyon sèvè espesifik, te pouse pa pwofil rezilta yo, jije pa ki fonksyon nf_hook_slow la te pran 18% nan tan an egzekite. Li te note ke nftables travay pi efikas pase iptables, men Amazon Linux kontinye sèvi ak iptables. Apre enfimite iptables, ogmantasyon pèfòmans lan te 22%, ak debi ogmante soti nan 495k req/s a 603k req/s.
  • Redwi migrasyon moun kap okipe yo ant diferan nwayo CPU pou amelyore efikasite itilizasyon kachèt processeur. Optimizasyon te pote soti tou de nan nivo pwosesis libreactor obligatwa nan nwayo CPU (CPU Pinning) ak nan pinning gestionnaire rezo nwayo (Resevwa Side Scaling). Pou egzanp, irqbalance te enfim ak keu afinite nan CPU a te klèman mete nan /proc/irq/$IRQ/smp_affinity_list. Pou itilize menm nwayo CPU a pou trete pwosesis libreactor a ak keu rezo pake k ap fèk ap rantre yo, yo itilize yon moun k ap okipe BPF koutim, ki konekte lè w mete drapo SO_ATTACH_REUSEPORT_CBPF a lè w ap kreye priz la. Pou mare keu pakè sortan yo nan CPU a, yo te chanje paramèt /sys/class/net/eth0/queues/tx-/xps_cpus. Ogmantasyon an jeneral pèfòmans te 38%, ak debi ogmante soti nan 603k req / s a ​​834k req / s.
  • Optimizasyon manyen entèwonp ak itilizasyon biwo vòt. Pèmèt mòd adaptive-rx nan chofè ENA a ak manipile sysctl net.core.busy_read ogmante pèfòmans pa 28% (debitasyon ogmante soti nan 834k req/s a 1.06M req/s, ak latansi diminye soti nan 361μs rive 292μs).
  • Enfimite sèvis sistèm ki mennen nan bloke initil nan chemine rezo a. Enfim dhclient ak manyèlman mete adrès IP la te lakòz yon ogmantasyon pèfòmans 6% ak debi ogmante soti nan 1.06M req/s a 1.12M req/s. Rezon ki fè dhclient afekte pèfòmans se nan analiz trafik lè l sèvi avèk yon priz anvan tout koreksyon.
  • Sou entènèt jwèt Goumen Spin Lock. Chanje pile rezo a nan mòd "noqueue" atravè sysctl "net.core.default_qdisc=noqueue" ak "tc qdisc ranplase dev eth0 root mq" te mennen nan yon ogmantasyon pèfòmans 2%, ak debi ogmante soti nan 1.12M req / s a ​​1.15M demann/s.
  • Finalman optimize minè, tankou enfim GRO (Jenerik Resevwa Offload) ak lòd "ethtool -K eth0 gro off" ak ranplase algorithm kontwòl konjesyon kib la ak reno lè l sèvi avèk sysctl "net.ipv4.tcp_congestion_control=reno". Ogmantasyon an jeneral pwodiktivite te 4%. Debi ogmante de 1.15M req/s pou 1.2M req/s.

Anplis de optimize yo ki te travay, atik la tou diskite metòd ki pa t 'mennen nan ogmantasyon nan pèfòmans espere. Pou egzanp, bagay sa yo te tounen inefikas:

  • Kouri libreactor separeman pa t diferan nan pèfòmans ak kouri li nan yon veso. Ranplase writev ak send, ogmante maxevents nan epoll_wait, ak eksperyans ak vèsyon GCC ak drapo pa te gen okenn efè (efè a te aparan sèlman pou drapo "-O3" ak "-march-native" yo).
  • Amelyore nwayo Linux la nan vèsyon 4.19 ak 5.4, lè l sèvi avèk pwogramasyon SCHED_FIFO ak SCHED_RR, manipile sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=pa janm, skew_source=ts1 pa afekte pèfòmans=tsXNUMX ak clocktick.
  • Nan chofè ENA a, pèmèt mòd Offload (segmentasyon, gaye-rasanble, rx/tx checksum), bati ak drapo "-O3" la, epi sèvi ak paramèt ena.rx_queue_size ak ena.force_large_llq_header pa te gen okenn efè.
  • Chanjman nan pile rezo a pa t amelyore pèfòmans:
    • Enfim IPv6: ipv6.disable=1
    • Enfim VLAN: modprobe -rv 8021q
    • Enfim tcheke sous pake
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (efè negatif)
    • 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_PRIORITE
    • TCP_NODELAY

    Sous: opennet.ru

Add nouvo kòmantè