Fínstillir Linux til að sinna 1.2 milljón JSON beiðnum á sekúndu

Ítarleg leiðarvísir hefur verið gefinn út um að stilla Linux umhverfið til að ná hámarksafköstum til að vinna úr HTTP beiðnum. Fyrirhugaðar aðferðir gerðu það mögulegt að auka afköst JSON örgjörvans sem byggir á libreactor bókasafninu í Amazon EC2 umhverfinu (4 vCPU) úr 224 þúsund API beiðnum á sekúndu með stöðluðum stillingum Amazon Linux 2 með kjarna 4.14 í 1.2 milljónir beiðna pr. sekúndu eftir hagræðingu (hækkun um 436%), og leiddi einnig til þess að tafir á afgreiðslu beiðna fækkuðu um 79%. Fyrirhugaðar aðferðir eru ekki sérstakar fyrir libreactor og virka þegar aðrir http netþjónar eru notaðir, þar á meðal nginx, Actix, Netty og Node.js (libreactor var notaður í prófunum vegna þess að lausnin sem byggð var á honum sýndi betri afköst).

Fínstillir Linux til að sinna 1.2 milljón JSON beiðnum á sekúndu

Grunnhagræðingar:

  • Fínstillir Libreactor kóða. R18 valmöguleikinn úr Techempower settinu var notaður sem grunnur, sem var endurbættur með því að fjarlægja kóða til að takmarka fjölda CPU kjarna sem notaðir voru (hagræðing leyfði að flýta vinnu um 25-27%), setja saman í GCC með "-O3" valkostunum (hækkun um 5-10% ) og "-mars-native" (5-10%), sem kemur í stað les/skrifa símtölum fyrir recv/send (5-10%) og minnkar kostnað við notkun pthreads (2-3%) . Heildarframmistöðuaukningin eftir fínstillingu kóðans var 55% og afköst jukust úr 224k req/s í 347k req/s.
  • Slökktu á vörn gegn íhugandi framkvæmdarveikleikum. Með því að nota færibreyturnar "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" við hleðslu á kjarnanum leyfðist það að auka afköst um 28% og afköst jukust úr 347k req/s í 446k req/s. Aukningin frá færibreytunni "nospectre_v1" (vernd gegn Spectre v1 + SWAPGS) var 1-2%, "nospectre_v2" (vernd gegn Spectre v2) - 15-20%, "pti=off" (Spectre v3/Meltdown) - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload og TSX ósamstilltur hætta) - 6%. Stillingar fyrir vörn gegn L1TF/Foreshadow (l1tf=skoða), iTLB multihit, Speculative Store Bypass og SRBDS árásir voru látnar óbreyttar, sem hafði ekki áhrif á frammistöðu þar sem þær skárust ekki prófuðu uppsetningunni (til dæmis, sérstaklega fyrir KVM, hreiður sýndarvæðingu og aðrar örgjörvagerðir).
  • Slökkt á endurskoðun og kerfissímtölum með því að nota "auditctl -a never,task" skipunina og tilgreina "--security-opt seccomp=unconfined" valmöguleikann þegar hafnargeymirinn er ræstur. Heildarframmistöðuaukningin var 11% og afköst jókst úr 446k req/s í 495k req/s.
  • Slökkva á iptables/netfilter með því að afferma tengdar kjarnaeiningar. Hugmyndin um að slökkva á eldveggnum, sem var ekki notaður í tiltekinni netþjónslausn, var kviknað af prófílniðurstöðum, þar sem nf_hook_slow aðgerðin tók 18% af tímanum að framkvæma. Það er tekið fram að nftables virkar skilvirkari en iptables, en Amazon Linux heldur áfram að nota iptables. Eftir að slökkt var á iptables var frammistöðuaukningin 22% og afköst jukust úr 495k req/s í 603k req/s.
  • Minni flutningur meðhöndlara milli mismunandi örgjörvakjarna til að bæta skilvirkni skyndiminnis örgjörva. Hagræðing var framkvæmd bæði á því stigi að binda libreactor ferla við CPU kjarna (CPU Pinning) og með því að festa kjarnanetstjórnun (Receive Side Scaling). Til dæmis var irqbalance óvirkt og biðraðarsækni við örgjörva var sérstaklega stillt í /proc/irq/$IRQ/smp_affinity_list. Til að nota sama CPU kjarna til að vinna úr libreactor ferlinu og netröð komandi pakka, er sérsniðinn BPF meðhöndlun notaður, tengdur með því að stilla SO_ATTACH_REUSEPORT_CBPF fánann þegar falsið er búið til. Til að binda biðraðir útgefinna pakka við örgjörvann hefur stillingunum /sys/class/net/eth0/queues/tx- verið breytt /xps_cpus. Heildarframmistöðuaukningin var 38% og afköst jókst úr 603k req/s í 834k req/s.
  • Hagræðing á meðhöndlun truflana og notkun kosninga. Með því að virkja aðlögunarhæfni-rx stillinguna í ENA drivernum og meðhöndla sysctl net.core.busy_read jókst árangur um 28% (afköst jukust úr 834k req/s í 1.06M req/s, og leynd minnkaði úr 361μs í 292μs).
  • Slökkva á kerfisþjónustu sem leiðir til óþarfa lokunar í netstaflanum. Ef slökkt var á dhclient og IP tölu var stillt handvirkt leiddi það til 6% aukningar á afköstum og afköst jukust úr 1.06M req/s í 1.12M req/s. Ástæðan fyrir því að dhclient hefur áhrif á frammistöðu er í umferðargreiningu með því að nota hráa fals.
  • Fighting Spin Lock. Að skipta um netstafla yfir í „noqueue“ ham í gegnum sysctl „net.core.default_qdisc=noqueue“ og „tc qdisc replace dev eth0 root mq“ leiddi til 2% afkastaaukningar og afköst jukust úr 1.12M req/s í 1.15M beiðni/s.
  • Lokastillingar, eins og að slökkva á GRO (Generic Receive Offload) með skipuninni „ethtool -K eth0 gro off“ og skipta út reikniritinu til að stjórna kubískum þrengslum fyrir reno með því að nota sysctl „net.ipv4.tcp_congestion_control=reno“. Heildarframleiðniaukningin var 4%. Afköst jukust úr 1.15M req/s í 1.2M req/s.

Auk hagræðinganna sem virkuðu er í greininni einnig fjallað um aðferðir sem leiddu ekki til væntanlegrar frammistöðuaukningar. Til dæmis reyndist eftirfarandi árangurslaust:

  • Að keyra Libreactor sérstaklega var ekki frábrugðin frammistöðu frá því að keyra hann í íláti. Það að skipta út writev fyrir send, auka maxevents í epoll_wait og gera tilraunir með GCC útgáfur og fána hafði engin áhrif (áhrifin voru aðeins áberandi fyrir „-O3“ og „-march-native“ fánana).
  • Uppfærsla á Linux kjarnanum í útgáfur 4.19 og 5.4, með því að nota SCHED_FIFO og SCHED_RR tímaáætlunina, meðhöndla sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=never, skew_tick=1 og clock hafði ekki áhrif.
  • Í ENA ökumanninum hafði það engin áhrif að virkja afhleðsluhami (skiptingu, dreifingu, rx/tx checksum), byggja með „-O3“ fánanum og nota ena.rx_queue_size og ena.force_large_llq_header færibreyturnar.
  • Breytingar á netstafla bættu ekki afköst:
    • Slökkva á IPv6: ipv6.disable=1
    • Slökktu á VLAN: modprobe -rv 8021q
    • Slökktu á upprunaathugun pakka
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (neikvæð áhrif)
    • 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

    Heimild: opennet.ru

Bæta við athugasemd