A’ dèanamh an fheum as fheàrr de Linux gus 1.2 millean iarrtas JSON a làimhseachadh gach diog

Tha stiùireadh mionaideach air fhoillseachadh mu bhith a’ gleusadh àrainneachd Linux gus an coileanadh as àirde a choileanadh airson a bhith a’ giullachd iarrtasan HTTP. Bha na dòighean a chaidh a mholadh air a dhèanamh comasach coileanadh pròiseasar JSON àrdachadh stèidhichte air an leabharlann lireactor ann an àrainneachd Amazon EC2 (4 vCPU) bho 224 mìle iarrtas API gach diog le suidheachaidhean àbhaisteach de Amazon Linux 2 le kernel 4.14 gu 1.2 millean iarrtas gach diog. dàrna às deidh optimization (àrdachadh de 436%), agus cuideachd air leantainn gu lùghdachadh ann an dàil ann an giullachd iarrtasan le 79%. Chan eil na modhan a thathar a’ moladh gu sònraichte airson lireactor agus obair nuair a bhios iad a’ cleachdadh frithealaichean http eile, a’ toirt a-steach nginx, Actix, Netty agus Node.js (chaidh an lireactor a chleachdadh ann an deuchainnean oir sheall am fuasgladh stèidhichte air coileanadh nas fheàrr).

A’ dèanamh an fheum as fheàrr de Linux gus 1.2 millean iarrtas JSON a làimhseachadh gach diog

Optimization bunaiteach:

  • Ag àrdachadh còd lireactor. Chaidh an roghainn R18 bhon phasgan Techempower a chleachdadh mar bhunait, a chaidh a leasachadh le bhith a’ toirt air falbh còd gus an àireamh de choraichean CPU a chaidh a chleachdadh a chuingealachadh (leig optimization obair a luathachadh le 25-27%), a’ cruinneachadh ann an GCC leis na roghainnean “-O3”. (àrdachadh de 5-10%) agus “-march-dùthchasach” (5-10%), a’ dol an àite fiosan leughaidh/sgrìobhaidh le recv/send (5-10%) agus a’ lughdachadh cosgais nuair a thathar a’ cleachdadh pthreads (2-3%) . B’ e an àrdachadh coileanaidh iomlan às deidh optimization còd 55%, agus mheudaich trochur bho 224k req/s gu 347k req/s.
  • Cuir à comas dìon an aghaidh so-leòntachd cur an gnìomh tuairmeasach. Le bhith a’ cleachdadh nam paramadairean “nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=dheth” nuair a bhathas a’ luchdachadh an kernel leig e le coileanadh àrdachadh le 28%, agus chaidh trochur suas bho 347k req/s gu 446k req/s. Air leth, bha an àrdachadh bhon pharameter “nospectre_v1” (dìon bho Specter v1 + SWAPGS) 1-2%, “nospectre_v2” (dìon bho Specter v2) - 15-20%, “pti = dheth” (Spectre v3 / Meltdown) - 6 %, "mds=dheth tsx_async_abort=dheth" (MDS/Zombieload agus TSX Asynchronous Abort) - 6%. Chaidh na roghainnean airson dìon an aghaidh L1TF/Foreshadow (l1tf = flush), iTLB multihit, seach-rathad stòr tuairmeasach agus ionnsaighean SRBDS fhàgail gun atharrachadh, rud nach tug buaidh air coileanadh leis nach robh iad a’ dol tarsainn air an rèiteachadh a chaidh a dhearbhadh (mar eisimpleir, gu sònraichte do KVM, neadachadh virtualization agus modalan CPU eile).
  • A’ cur à comas dòighean sgrùdaidh agus casg gairm siostaim a’ cleachdadh an àithne “auditctl -a never,task” agus a’ sònrachadh an roghainn “--security-opt seccomp=unconfined” nuair a thòisicheas tu air soitheach an docadair. B’ e an àrdachadh coileanaidh iomlan 11%, agus mheudaich trochur bho 446k req/s gu 495k req/s.
  • A’ cur à comas iptables/netfilter le bhith a’ luchdachadh nam modalan kernel co-cheangailte riutha. Chaidh am beachd am balla-teine ​​​​a chuir dheth, nach deach a chleachdadh ann am fuasgladh frithealaiche sònraichte, a bhrosnachadh le toraidhean pròifil, a’ breithneachadh leis an tug an gnìomh nf_hook_slow 18% den ùine airson a chuir gu bàs. Thathas a’ toirt fa-near gu bheil nftables ag obair nas èifeachdaiche na iptables, ach tha Amazon Linux fhathast a’ cleachdadh iptables. Às deidh iptables a dhì-chomasachadh, bha an àrdachadh coileanaidh aig 22%, agus mheudaich trochur bho 495k req / s gu 603k req / s.
  • Lùghdachadh air imrich luchd-làimhseachaidh eadar diofar choraichean CPU gus èifeachdas cleachdadh tasgadan pròiseasar a leasachadh. Chaidh optimachadh a dhèanamh an dà chuid aig ìre pròiseasan lireactor ceangail gu coraichean CPU (CPU Pinning) agus tro bhith a’ pinadh luchd-làimhseachaidh lìonra kernel (Faigh Sgèile Taobh). Mar eisimpleir, chaidh irqbalance a chiorramachadh agus chaidh dàimh ciudha ris an CPU a shuidheachadh gu soilleir ann an / proc/irq/$IRQ/smp_affinity_list. Gus an aon chridhe CPU a chleachdadh gus pròiseas lireactor agus ciudha lìonra nam pacaidean a tha a’ tighinn a-steach a phròiseasadh, thathas a’ cleachdadh inneal-làimhseachaidh BPF àbhaisteach, ceangailte le bhith a’ suidheachadh a’ bhratach SO_ATTACH_REUSEPORT_CBPF nuair a chruthaicheas tu an t-socaid. Gus ciudhaichean de phasganan a-mach a cheangal ris an CPU, chaidh na roghainnean / sys/class/net/eth0/queues/tx- atharrachadh /xps_cpus. B’ e an àrdachadh coileanaidh iomlan 38%, agus mheudaich trochur bho 603k req/s gu 834k req/s.
  • Optimization de làimhseachadh brisidh agus cleachdadh bhòtaidh. Le bhith a’ comasachadh a’ mhodh atharrachail-rx anns an draibhear ENA agus a’ làimhseachadh sysctl net.core.busy_read mheudaich coileanadh le 28% (thèid àrdachadh bho 834k req/s gu 1.06M req/s, agus lughdaich latency bho 361μs gu 292μs).
  • A’ cur casg air seirbheisean siostam a dh’ adhbhraicheas bacadh neo-riatanach ann an stac an lìonraidh. Le bhith a’ cur às do dhclient agus a’ suidheachadh an t-seòlaidh IP le làimh thàinig àrdachadh dèanadais 6% agus mheudaich trochur bho 1.06M req/s gu 1.12M req/s. Tha an adhbhar a tha dhclient a’ toirt buaidh air coileanadh ann am mion-sgrùdadh trafaic a’ cleachdadh socaid amh.
  • An t-strì an aghaidh Spin Lock. Le bhith ag atharrachadh stac an lìonraidh gu modh “noqueue” tro sysctl “net.core.default_qdisc=noqueue” agus “tc qdisc replace dev eth0 root mq” thàinig àrdachadh coileanaidh 2%, agus chaidh àrdachadh ann an coileanadh bho 1.12M req/s gu 1.15M feum/s.
  • Mion-leasachaidhean deireannach, leithid a bhith a’ cuir à comas GRO (Generic Receive Offload) leis an àithne “ethtool -K eth0 gro off” agus a’ cur an àite an algairim smachd dùmhlachd ciùbach le reno a’ cleachdadh sysctl “net.ipv4.tcp_congestion_control=reno”. B’ e an àrdachadh cinneasachd iomlan 4%. Mheudaich tréchur bho 1.15M req/s gu 1.2M req/s.

A bharrachd air na optimizations a bha ag obair, tha an artaigil cuideachd a’ beachdachadh air dòighean nach do lean gu àrdachadh coileanaidh ris an robh dùil. Mar eisimpleir, bha na leanas neo-èifeachdach:

  • Cha robh ruith lireactor air leth eadar-dhealaichte ann an coileanadh bho bhith ga ruith ann an soitheach. Cha robh buaidh sam bith aig a bhith a’ cur fios an àite writev, a’ meudachadh àrdachadh ann an epoll_wait, agus a’ feuchainn ri dreachan GCC agus brataichean (cha robh a’ bhuaidh ri fhaicinn ach airson na brataichean “-O3” agus “-march-native”).
  • Ag àrdachadh an kernel Linux gu dreachan 4.19 agus 5.4, a’ cleachdadh na clàran-ama SCHED_FIFO agus SCHED_RR, a’ làimhseachadh sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, trédhearcach_hugepages=cha do rinn a-riamh, skew agus cha do rinn a’ bhuaidh aig clocksource.
  • Anns an draibhear ENA, cha robh buaidh aig a bhith a’ comasachadh modhan Offload (segmentation, scatter-gather, rx/tx checksum), a’ togail leis a’ bhratach “-O3”, agus a’ cleachdadh paramadairean ena.rx_queue_size agus ena.force_large_llq_header.
  • Cha do leasaich atharrachaidhean san stac lìonra coileanadh:
    • Cuir à comas IPv6: ipv6.disable=1
    • Cuir à comas VLAN: modprobe -rv 8021q
    • Cuir à comas sgrùdadh stòr pacaid
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (buaidh àicheil)
    • net.ipv4.tcp_sack = 0
    • net.ipv4.tcp_dsack=0
    • lìon.ipv4.tcp_mem/tcp_wem/tcp_rmem
    • net.core.netdev_buidseit
    • net.core.dev_cuideam
    • 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: fosgailtenet.ru

Cuir beachd ann