Ukulungiselela i-Linux ukuphatha izicelo ze-JSON ezizigidi ezisisi-1.2 ngomzuzwana

Isikhokelo esineenkcukacha sele sipapashiwe ekulungiseni imeko ye-Linux ukuze kuphunyezwe ukusebenza okuphezulu ekuqhubeni izicelo ze-HTTP. Iindlela ezicetywayo zenze ukuba kube lula ukunyusa ukusebenza kweprosesa ye-JSON esekelwe kwilayibrari ye-libreactor kwindawo ye-Amazon EC2 (4 vCPU) ukusuka kwi-224 yezicelo ze-API eziliwaka ngomzuzwana kunye nezicwangciso ezisemgangathweni ze-Amazon Linux 2 kunye ne-kernel 4.14 ukuya kwi-1.2 yezicelo zezigidi okwesibini emva kokuphucula (ukwanda kwama-436%), kwaye kwakhona kukhokelele ekunciphiseni ukulibaziseka ekuqhubeni izicelo ngama-79%. Iindlela ezicetywayo azichanekanga kwi-libreactor kwaye zisebenza xa usebenzisa ezinye iiseva ze-http, kuquka i-nginx, i-Actix, i-Netty kunye ne-Node.js (i-libreactor isetyenziswe kwiimvavanyo kuba isisombululo esisekelwe kuyo sibonise ukusebenza okungcono).

Ukulungiselela i-Linux ukuphatha izicelo ze-JSON ezizigidi ezisisi-1.2 ngomzuzwana

Ulungiselelo olusisiseko:

  • Ukuphucula ikhowudi ye-libreactor. Inketho ye-R18 esuka kwi-Techempower kit isetyenziswe njengesiseko, eyaphuculwa ngokususa ikhowudi ukunciphisa inani le-CPU cores ezisetyenzisiweyo (ukulungiswa kuvunyelwe ukukhawulezisa umsebenzi nge-25-27%), ukuhlanganiswa kwi-GCC kunye ne "-O3" iinketho. (ukwanda kwe-5-10% ) kunye "ne-march-native" (5-10%), ukutshintshwa kweefowuni zokufunda / ukubhala nge-recv / ukuthumela (5-10%) kunye nokunciphisa i-overhead xa usebenzisa i-pthreads (2-3%) . Ukunyuka kwentsebenzo ngokubanzi emva kokulungiswa kwekhowudi kwakuyi-55%, kwaye i-throughput inyuke ukusuka kwi-224k req / s ukuya kwi-347k req / s.
  • Khubaza ukhuseleko kubuthathaka obucingelwayo. Ukusebenzisa i-parameters "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" xa ulayisha i-kernel evunyelwe ukwandisa ukusebenza nge-28%, kunye nokunyuka kwe-347k req / s ukuya kwi-446k req / s. Ngokwahlukileyo, ukunyuka kwipharamitha "nospectre_v1" (ukukhusela kwi-Specter v1 + SWAPGS) ngu-1-2%, "nospectre_v2" (ukukhusela kwi-Specter v2) - 15-20%, "pti = off" (Specter v3 / Meltdown) - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload kunye ne-TSX Asynchronous Abortion) - 6%. Iisetingi zokhuseleko kwi-L1TF/Foreshadow (l1tf=gungxula), iTLB multihit, i-Speculative Store Bypass kunye nohlaselo lwe-SRBDS ziye zashiywa zingatshintshwanga, nto leyo engazange ichaphazele ukusebenza kwayo kuba ingakhange idibane noqwalaselo oluvavanyiweyo (umzekelo, oluthe ngqo kwi-KVM, lufakwe kwindlwane. virtualization kunye nezinye iimodeli ze-CPU).
  • Ukuyekisa uphicotho-zincwadi kunye neendlela zokuthintela umnxeba wenkqubo kusetyenziswa umyalelo othi "auditctl -a never,task" kwaye uchaza "--security-opt seccomp=unconfined" xa uqalisa isikhongozeli sedokhi. Ukonyuka kwentsebenzo kukonke kwaba yi-11%, kwaye iziphumo zonyuka ukusuka kwi-446k req/s ukuya kwi-495k req/s.
  • Ikhubaza iptables/netfilter ngokukhupha iimodyuli zekernel ezinxulumeneyo. Ingcamango yokukhubaza i-firewall, engazange isetyenziswe kwisisombululo esithile somncedisi, yakhuthazwa yiziphumo zeprofayili, ukugweba apho umsebenzi we-nf_hook_slow uthatha i-18% yexesha lokuqhuba. Kuyaphawulwa ukuba ii-nftables zisebenza ngokufanelekileyo ngakumbi kune-iptables, kodwa i-Amazon Linux iyaqhubeka nokusebenzisa iiptables. Emva kokukhubaza i-iptables, ukunyuka komsebenzi kwakungama-22%, kwaye i-throughput inyuke ukusuka kwi-495k req / s ukuya kwi-603k req / s.
  • Ukunciphisa ukufuduka kwabaphathi phakathi kwe-CPU cores ezahlukeneyo ukuphucula ukusebenza kakuhle kokusetyenziswa kwe-cache yeprosesa. Ukuphuculwa kuqhutywe zombini kwinqanaba lokubopha iinkqubo ze-libreactor kwii-CPU cores (CPU Pinning) kunye ne-pinning kernel network handlers (Fumana iSide Scaling). Ngokomzekelo, i-irqbalance ivaliwe kwaye ukuhambelana komgca kwi-CPU kwakusekwe ngokucacileyo kwi-/proc/irq/$IRQ/smp_affinity_list. Ukusebenzisa undoqo we-CPU ukucubungula inkqubo ye-libreactor kunye nomgca womnatha weepakethi ezingenayo, isiphathi se-BPF esiqhelekileyo sisetyenzisiweyo, sidibaniswe ngokucwangcisa i-SO_ATTACH_REUSEPORT_CBPF iflegi xa udala i-socket. Ukubophelela imigca yeepakethi eziphumayo kwi-CPU, izicwangciso /sys/class/net/eth0/queues/tx- zitshintshiwe /xps_cpus. Ukonyuka kwentsebenzo kukonke kwaba ngama-38%, kwaye iziphumo zonyuka ukusuka kwi-603k req/s ukuya kwi-834k req/s.
  • Ukuphucula ukuphathwa kokuphazamiseka kunye nokusetyenziswa kokuvota. Ukuvumela i-adaptive-rx mode kumqhubi we-ENA kunye nokuxhaphaza i-sysctl net.core.busy_read yokwandisa ukusebenza nge-28% (i-throughput inyuke ukusuka kwi-834k req / s ukuya kwi-1.06M req / s, kunye ne-latency yehla ukusuka kwi-361ΞΌs ukuya kwi-292ΞΌs).
  • Ukukhubaza iinkonzo zenkqubo ezikhokelela ekuthinteleni ngokungeyomfuneko kwisitaki sothungelwano. Ukukhubaza i-dhclient kunye nokuseta ngesandla idilesi ye-IP kubangele ukunyuka kwentsebenzo ye-6% kunye ne-throughput yonyuka ukusuka kwi-1.06M req/s ukuya kwi-1.12M req/s. Isizathu sokuba i-dhclient ichaphazele ukusebenza kukuhlalutya lwetrafikhi usebenzisa i-socket eluhlaza.
  • Ukulwa Spin Lock. Ukutshintshela isitaki sothungelwano kwimowudi ye-"noqueue" ngokusebenzisa i-sysctl "net.core.default_qdisc=noqueue" kunye ne-"tc qdisc replace dev eth0 root mq" kukhokelele ekunyukeni kwe-2% yokusebenza, kunye nokuphuma kwe-1.12M req/s ukuya kwi-1.15M req/s.
  • Ukulungiswa okuncinci kokugqibela, okufana nokuvala iGRO (Generic Receive Offload) ngomyalelo "ethtool -K eth0 gro off" kunye nokutshintsha icubic congestion algorithm ngereno usebenzisa sysctl β€œnet.ipv4.tcp_congestion_control=reno”. Ukonyuka kwemveliso kukonke kwaba sisi-4%. Imveliso inyuke ukusuka kwi-1.15M req/s ukuya kwi-1.2M req/s.

Ukongeza kwi-optimizations esebenzayo, inqaku likwaxubusha iindlela ezingazange zikhokele ekunyuseni okulindelweyo kokusebenza. Umzekelo, oku kulandelayo kwabonakala kungasebenzi:

  • Ukubaleka i-libreactor ngokwahlukeneyo akuzange kwahluke ekusebenzeni ukusuka ekuyiqhubeni kwisikhongozeli. Ukutshintsha i-writterv nge-send, ukwandisa i-maxevents kwi-epoll_wait, kunye nokuzama iinguqulelo ze-GCC kunye neeflegi akuzange kubekho umphumo (umphumo wawuphawuleka kuphela kwiiflegi "-O3" kunye "ne-march-native").
  • Ukuphucula i-Linux kernel kwiinguqulelo ze-4.19 kunye ne-5.4, kusetyenziswa i-SCHED_FIFO kunye ne-SCHED_RR abacwangcisi, ukuxhaphaza i-sysctl kernel.sched_min_granularity_ns, i-kernel.sched_wakeup_granularity_ns, i-transparent_hugepages=never, ukusebenza=tscw did_tick.
  • Kumqhubi we-ENA, uvumela iindlela zokuLahla (ukwahlula, ukusabalalisa-ukuqokelela, i-rx/tx checksum), ukwakha nge-"-O3" iflegi, kunye nokusebenzisa i-ena.rx_queue_size kunye ne-ena.force_large_llq_header parameters kwakungekho mphumo.
  • Utshintsho kwisitaki sothungelwano aluzange luphucule ukusebenza:
    • Khubaza i-IPv6: ipv6.disable=1
    • Khubaza i-VLAN: modprobe -rv 8021q
    • Khubaza ujongo lomthombo wepakethe
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (isiphumo esibi)
    • 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

    umthombo: opennet.ru

Yongeza izimvo