Optimization Linux hiatrehana ny fangatahana JSON 1.2 tapitrisa isan-tsegondra

Navoaka ny torolàlana amin'ny antsipiriany momba ny fandrindrana ny tontolo Linux mba hahazoana fahombiazana ambony indrindra amin'ny fanodinana ny fangatahana HTTP. Ny fomba natolotra dia nahafahana nampitombo ny fampandehanana ny processeur JSON mifototra amin'ny tranomboky libreactor ao amin'ny tontolo Amazon EC2 (4 vCPU) avy amin'ny fangatahana API 224 arivo isan-tsegondra miaraka amin'ny filaharana mahazatra an'ny Amazon Linux 2 miaraka amin'ny kernel 4.14 ka hatramin'ny fangatahana 1.2 tapitrisa isaky ny faharoa taorian'ny fanatsarana (fitomboan'ny 436%), ary nitarika ihany koa ny fampihenana ny fahatarana amin'ny fikarakarana ny fangatahana amin'ny 79%. Ny fomba atolotra dia tsy voafaritra manokana amin'ny libreactor ary miasa rehefa mampiasa mpizara http hafa, ao anatin'izany ny nginx, Actix, Netty ary Node.js (libreactor dia nampiasaina tamin'ny fitsapana satria ny vahaolana mifototra amin'izany dia nampiseho fahombiazana tsara kokoa).

Optimization Linux hiatrehana ny fangatahana JSON 1.2 tapitrisa isan-tsegondra

Optimization fototra:

  • Fanamafisana ny kaody libreactor. Ny safidy R18 avy amin'ny kitapo Techmpower dia nampiasaina ho fototra, izay nohatsaraina tamin'ny fanesorana ny kaody mba hamerana ny isan'ny CPU cores ampiasaina (optimization mamela ny asa haingana amin'ny 25-27%), mivory ao amin'ny GCC miaraka amin'ny safidy "-O3". (fitomboana 5-10%) sy "-march-native" (5-10%), manolo ny antso mamaky/manoratra amin'ny recv/send (5-10%) ary mampihena ny overhead rehefa mampiasa pthreads (2-3%) . Ny fitomboan'ny fampisehoana ankapobeny taorian'ny fanatsarana ny kaody dia 55%, ary nitombo avy amin'ny 224k req/s ho 347k req/s ny throughput.
  • Atsaharo ny fiarovana amin'ny vulnerabilities momba ny famonoana. Mampiasa ny mari-pamantarana "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" rehefa mametaka ny kernel navela hampitombo ny fahombiazan'ny 28%, ary nitombo ny throughput avy amin'ny 347k req/s ka hatramin'ny 446k req/s. Misaraka, ny fiakaran'ny mari-pamantarana "nospectre_v1" (fiarovana amin'ny Spectre v1 + SWAPGS) dia 1-2%, "nospectre_v2" (fiarovana amin'ny Spectre v2) - 15-20%, "pti = off" (Spectre v3 / Meltdown) - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload sy TSX Asynchronous Abort) - 6%. Navela tsy niova ny fika fiarovana amin'ny L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass ary SRBDS, izay tsy nisy fiantraikany tamin'ny fampandehanana satria tsy nifandona tamin'ny fikirakirana notsapaina (ohatra, manokana ho an'ny KVM, nested. virtoaly sy modely CPU hafa).
  • Ny fanafoanana ny fanaraha-maso sy ny rafitra fanakanana antso amin'ny alàlan'ny baiko "auditctl -a never,task" ary mamaritra ny safidy "--security-opt seccomp=unconfined" rehefa manomboka ny container docker. Ny fitomboan'ny fampisehoana ankapobeny dia 11%, ary niakatra avy amin'ny 446k req/s ka hatramin'ny 495k req/s ny throughput.
  • Fanesorana ny iptables/netfilter amin'ny alàlan'ny famoahana ireo maody kernel mifandraika. Ny hevitra hanesorana ny firewall, izay tsy nampiasaina tamin'ny vahaolana amin'ny server manokana, dia natosiky ny valin'ny profiling, raha jerena ny fomba nf_hook_slow dia naka 18% ny fotoana hanatanterahana. Marihina fa ny nftables dia miasa mahomby kokoa noho ny iptables, fa ny Amazon Linux dia manohy mampiasa iptables. Taorian'ny nanesorana ny iptables dia 22% ny fitomboan'ny zava-bita, ary nitombo ny 495k req/s hatramin'ny 603k req/s.
  • Ny fampihenana ny fifindran'ny mpitantana eo anelanelan'ny cores CPU samihafa mba hanatsarana ny fahombiazan'ny fampiasana cache processeur. Ny fanatsarana dia natao tamin'ny ambaratongan'ny fizotry ny libreactor mamatotra amin'ny cores CPU (CPU Pinning) ary amin'ny alàlan'ny fanerena ireo mpitantana tambajotra kernel (Receive Side Scaling). Ohatra, nesorina ny irqbalance ary napetraka mazava ao amin'ny /proc/irq/$IRQ/smp_affinity_list ny filaharana filaharana amin'ny CPU. Mba hampiasana ny fototry ny CPU mitovy amin'ny fanodinana ny dingan'ny libreactor sy ny filaharana tambajotra amin'ny fonosana ho avy, dia ampiasaina ny mpandrindra BPF mahazatra, mifandray amin'ny fametrahana ny saina SO_ATTACH_REUSEPORT_CBPF rehefa mamorona ny socket. Mba hamehezana ny filaharana amin'ny fonosana mivoaka amin'ny CPU dia niova ny fikandrana /sys/class/net/eth0/queues/tx- /xps_cpus. Ny fitomboan'ny fampisehoana ankapobeny dia 38%, ary niakatra avy amin'ny 603k req/s ka hatramin'ny 834k req/s ny throughput.
  • Fanamafisana ny fikarakarana tapaka sy ny fampiasana ny fandatsaham-bato. Ny fampandehanana ny maody adaptive-rx ao amin'ny mpamily ENA sy ny fanodikodinana sysctl net.core.busy_read dia nampitombo ny fahombiazan'ny 28% (nitombo ny throughput avy amin'ny 834k req / s ka hatramin'ny 1.06M req / s, ary nihena ny latency avy amin'ny 361μs ka hatramin'ny 292μs).
  • Fanesorana ny serivisy rafitra izay mitarika amin'ny fanakanana tsy ilaina amin'ny tamba-jotra. Ny fanalana ny dhclient sy ny fametrahana amin'ny tanana ny adiresy IP dia niteraka fitomboana 6% ary nitombo ny throughput avy amin'ny 1.06M req/s ka hatramin'ny 1.12M req/s. Ny anton'ny fiantraikan'ny dhclient amin'ny fampisehoana dia amin'ny famakafakana ny fifamoivoizana amin'ny fampiasana socket manta.
  • Miady amin'ny Spin Lock. Ny famadihana ny tambazotran'ny tambajotra amin'ny mode "noqueue" amin'ny alàlan'ny sysctl "net.core.default_qdisc=noqueue" sy ny "tc qdisc replace dev eth0 root mq" dia nitarika ny fitomboan'ny fampisehoana 2%, ary nitombo ny throughput avy amin'ny 1.12M req/s ho 1.15M req/s.
  • Fanatsarana kely farany, toy ny fanafoanana ny GRO (Generic Receive Offload) miaraka amin'ny baiko "ethtool -K eth0 gro off" ary manolo ny algorithm mifehy ny fitohanana cubic amin'ny reno mampiasa sysctl "net.ipv4.tcp_congestion_control=reno". Ny fitomboan'ny famokarana ankapobeny dia 4%. Nitombo ny throughput avy amin'ny 1.15M req/s ka hatramin'ny 1.2M req/s.

Ho fanampin'ireo optimizations izay niasa, ny lahatsoratra dia miresaka momba ny fomba izay tsy nitarika ho amin'ny fampiakarana ny fampisehoana. Ohatra, ireto manaraka ireto dia tsy nahomby:

  • Ny fampandehanana libreactor mitokana dia tsy misy fahasamihafana amin'ny fampisehoana amin'ny fampandehanana azy ao anaty fitoeran-javatra. Ny fanoloana ny writev amin'ny fandefasana, ny fampitomboana ny maxevents amin'ny epoll_wait, ary ny fanandramana amin'ny dikan-teny GCC sy ny saina dia tsy nisy vokany (ny saina "-O3" sy "-march-native" ihany no tsikaritra.
  • Ny fanavaozana ny kernel Linux amin'ny dikan-teny 4.19 sy 5.4, amin'ny fampiasana ny SCHED_FIFO sy SCHED_RR fandaharam-potoana, manodinkodina sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=never, skew_tick=1 ary tsy nisy fiantraikany tamin'ny clocksource=tsc.
  • Ao amin'ny mpamily ENA, mamela ny maody Offload (segmentation, scatter-gather, rx/tx checksum), fananganana miaraka amin'ny saina "-O3", ary ny fampiasana ny ena.rx_queue_size sy ena.force_large_llq_header paramètre dia tsy nisy vokany.
  • Tsy nanatsara ny fampandehanana ny fiovan'ny tamba-jotra:
    • Atsaharo ny IPv6: ipv6.disable=1
    • Atsaharo ny VLAN: modprobe -rv 8021q
    • Atsaharo ny fanamarinana loharanon'ny fonosana
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (vokatra ratsy)
    • 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

    Source: opennet.ru

Add a comment