Optimeiddio Linux i drin 1.2 miliwn o geisiadau JSON yr eiliad

Mae canllaw manwl wedi'i gyhoeddi ar diwnio amgylchedd Linux i gyflawni'r perfformiad mwyaf ar gyfer prosesu ceisiadau HTTP. Roedd y dulliau arfaethedig yn ei gwneud hi'n bosibl cynyddu perfformiad y prosesydd JSON yn seiliedig ar y llyfrgell libreactor yn amgylchedd Amazon EC2 (4 vCPU) o 224 mil o geisiadau API yr eiliad gyda gosodiadau safonol Amazon Linux 2 gyda chnewyllyn 4.14 i 1.2 miliwn o geisiadau yr eiliad yn ail ar ôl optimeiddio (cynnydd o 436%), a hefyd wedi arwain at ostyngiad o 79% mewn oedi wrth brosesu ceisiadau. Nid yw'r dulliau arfaethedig yn benodol i libreactor a gwaith wrth ddefnyddio gweinyddwyr http eraill, gan gynnwys nginx, Actix, Netty a Node.js (defnyddiwyd Libreactor mewn profion oherwydd bod yr ateb yn seiliedig arno yn dangos perfformiad gwell).

Optimeiddio Linux i drin 1.2 miliwn o geisiadau JSON yr eiliad

Optimeiddio sylfaenol:

  • Optimeiddio cod libreactor. Defnyddiwyd yr opsiwn R18 o'r pecyn Techempower fel sail, a gafodd ei wella trwy gael gwared ar y cod i gyfyngu ar nifer y creiddiau CPU a ddefnyddir (roedd optimeiddio yn caniatáu cyflymu gwaith 25-27%), gan gydosod yn GCC gyda'r opsiynau “-O3”. (cynnydd o 5-10%) a "-march-brodorol" (5-10%), disodli galwadau darllen/ysgrifennu gyda recv/anfon (5-10%) a lleihau gorbenion wrth ddefnyddio edreadau (2-3%) . Y cynnydd cyffredinol mewn perfformiad ar ôl optimeiddio cod oedd 55%, a chynyddodd trwybwn o 224k cais/s i 347k cais/s.
  • Analluogi amddiffyniad rhag gwendidau gweithredu hapfasnachol. Gan ddefnyddio'r paramedrau “nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off” wrth lwytho'r cnewyllyn, caniateir cynyddu perfformiad 28%, a chynyddodd y mewnbwn o 347k req/s i 446k req/s. Ar wahân, y cynnydd o'r paramedr “nospectre_v1” (amddiffyniad rhag Specter v1 + SWAPGS) oedd 1-2%, “nospectre_v2” (amddiffyn rhag Specter v2) - 15-20%, "pti=off" (Spectre v3/Meltdown) - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload a TSX Erthylu Asynchronous) - 6%. Gadawyd y gosodiadau ar gyfer amddiffyniad yn erbyn ymosodiadau L1TF/Foreshadow (l1tf=flush), iTLB multihit, Ffordd Osgoi Siop Sbectol ac SRBDS heb eu newid, nad oedd yn effeithio ar berfformiad gan nad oeddent yn croestorri â'r ffurfwedd a brofwyd (er enghraifft, yn benodol i KVM, wedi'i nythu rhithwiroli a modelau CPU eraill).
  • Analluogi archwilio a mecanweithiau blocio galwadau system gan ddefnyddio'r gorchymyn "auditctl -a never,task" a nodi'r opsiwn "--security-opt seccomp=unconfined" wrth gychwyn y cynhwysydd docwr. Y cynnydd cyffredinol mewn perfformiad oedd 11%, a chynyddodd trwybwn o 446k o ofynion i 495k o ofynion.
  • Analluogi iptables/netfilter trwy ddadlwytho'r modiwlau cnewyllyn cysylltiedig. Ysgogwyd y syniad i analluogi'r wal dân, na chafodd ei defnyddio mewn datrysiad gweinydd penodol, gan ganlyniadau proffilio, gan farnu y cymerodd swyddogaeth nf_hook_slow 18% o'r amser i'w gweithredu. Nodir bod nftables yn gweithio'n fwy effeithlon nag iptables, ond mae Amazon Linux yn parhau i ddefnyddio iptables. Ar ôl analluogi iptables, y cynnydd mewn perfformiad oedd 22%, a chynyddodd trwybwn o 495k cais/s i 603k req/s.
  • Llai o ymfudiad trinwyr rhwng gwahanol greiddiau CPU i wella effeithlonrwydd y defnydd o storfa prosesydd. Cyflawnwyd optimeiddio ar lefel prosesau rhwymol libreactor i creiddiau CPU (Pinnio CPU) a thrwy drinwyr rhwydwaith cnewyllyn pinio (Derbyn Graddio Ochr). Er enghraifft, analluogwyd irqbalance a gosodwyd affinedd ciw i'r CPU yn benodol yn /proc/irq/$IRQ/smp_affinity_list. I ddefnyddio'r un craidd CPU i brosesu'r broses libreactor a'r ciw rhwydwaith o becynnau sy'n dod i mewn, defnyddir triniwr BPF wedi'i deilwra, wedi'i gysylltu trwy osod baner SO_ATTACH_REUSEPORT_CBPF wrth greu'r soced. Er mwyn clymu ciwiau o becynnau sy'n mynd allan i'r CPU, mae'r gosodiadau / sys/class/net/eth0/queues/tx- wedi'u newid /xps_cpus. Y cynnydd cyffredinol mewn perfformiad oedd 38%, a chynyddodd trwybwn o 603k o ofynion i 834k o ofynion.
  • Optimeiddio trin ymyriadau a defnyddio pleidleisio. Cynyddodd galluogi'r modd addasol-rx yn y gyrrwr ENA a thrin sysctl net.core.busy_read berfformiad 28% (cynyddodd trwybwn o 834k req/s i 1.06M req/s, a gostyngodd hwyrni o 361μs i 292μs).
  • Analluogi gwasanaethau system sy'n arwain at rwystro diangen yn y pentwr rhwydwaith. Arweiniodd analluogi dhclient a gosod y cyfeiriad IP â llaw at gynnydd o 6% mewn perfformiad a chynyddodd mewnbwn o 1.06M o ymholiad i 1.12M o req/s. Y rheswm y mae dhclient yn effeithio ar berfformiad yw dadansoddi traffig gan ddefnyddio soced amrwd.
  • Ymladd Spin Lock. Arweiniodd newid y pentwr rhwydwaith i'r modd “noqueue” trwy sysctl “net.core.default_qdisc=noqueue” a “tc qdisc replace dev eth0 root mq” at gynnydd perfformiad o 2%, a chynyddodd trwybwn o 1.12M req/s i 1.15M gofyn/au.
  • Mân optimeiddiadau terfynol, megis analluogi GRO (Generic Receive Offload) gyda'r gorchymyn “ethtool -K eth0 gro off” a disodli'r algorithm rheoli tagfeydd ciwbig gyda reno gan ddefnyddio sysctl “net.ipv4.tcp_congestion_control=reno”. Y cynnydd cyffredinol mewn cynhyrchiant oedd 4%. Cynyddodd trwybwn o 1.15M o ymholiad i 1.2M o ymholiad.

Yn ogystal â'r optimizations a weithiodd, mae'r erthygl hefyd yn trafod dulliau nad oedd yn arwain at y cynnydd perfformiad disgwyliedig. Er enghraifft, roedd y canlynol yn aneffeithiol:

  • Nid oedd perfformiad rhedeg libreactor ar wahân yn wahanol o ran perfformiad i'w redeg mewn cynhwysydd. Ni chafodd disodli writev ag anfon, cynyddu maxevents yn epoll_wait, ac arbrofi gyda fersiynau GCC a baneri unrhyw effaith (dim ond ar gyfer y baneri “-O3” a “-march-native” yr oedd yr effaith yn amlwg.
  • Uwchraddio'r cnewyllyn Linux i fersiynau 4.19 a 5.4, gan ddefnyddio'r amserlenwyr SCHED_FIFO a SCHED_RR, trin sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, trédhearcach_hugepages=byth, nid oedd skew=skew a performance_tick yn effeithio ar berfformiad
  • Yn y gyrrwr ENA, nid oedd gan alluogi moddau Offload (segmentu, gwasgariad-gasglu, checksum rx/tx), adeiladu gyda'r faner “-O3”, a defnyddio'r paramedrau ena.rx_queue_size ac ena.force_large_llq_header unrhyw effaith.
  • Ni wnaeth newidiadau yn y pentwr rhwydwaith wella perfformiad:
    • Analluogi IPv6: ipv6.disable=1
    • Analluogi VLAN: modprobe -rv 8021q
    • Analluogi gwirio ffynhonnell pecyn
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (effaith negyddol)
    • net.ipv4.tcp_sack = 0
    • net.ipv4.tcp_dsack=0
    • net.ipv4.tcp_mem/tcp_wem/tcp_rmem
    • net.core.netdev_gyllideb
    • net.core.dev_pwysau
    • 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

    Ffynhonnell: opennet.ru

Ychwanegu sylw