Te whakapai ake i te Linux ki te hapai i te 1.2 miriona tono JSON mo ia hekona

Kua whakaputaina he aratohu taipitopito mo te whakatikatika i te taiao Linux ki te whakatutuki i nga mahi tino pai mo te tukatuka i nga tono HTTP. Ko nga tikanga i whakaarohia ka taea te whakanui ake i te mahi o te tukatuka JSON i runga i te whare pukapuka libreactor i roto i te Amazon EC2 taiao (4 vCPU) mai i te 224 mano tono API mo ia rua me nga tautuhinga paerewa o Amazon Linux 2 me te kernel 4.14 ki te 1.2 miriona tono mo ia. tuarua i muri i te arotautanga (te pikinga o te 436%), me te heke iho o nga whakaroa i nga tono tukatuka e 79%. Ko nga tikanga e whakaarohia ana ehara i te mea motuhake ki te libreactor me te mahi i te wa e whakamahi ana i etahi atu tūmau http, tae atu ki te nginx, Actix, Netty me Node.js (i whakamahia te libreactor i roto i nga whakamatautau na te mea ko te otinga i runga i te whakaatu i te pai ake o te mahi).

Te whakapai ake i te Linux ki te hapai i te 1.2 miriona tono JSON mo ia hekona

Nga arotautanga taketake:

  • Te arotau i te waehere freeactor. Ko te kōwhiringa R18 mai i te kete Techmpower i whakamahia hei turanga, i pai ake ma te tango i te waehere hei whakaiti i te maha o nga papa CPU i whakamahia (ko te arotautanga ka whakaaetia kia tere ake te mahi ma te 25-27%), ka huihui ki te GCC me nga whiringa "-O3". (he pikinga o te 5-10%) me te "-march-native" (5-10%), ka whakakapi i nga waea panui/tuhi ki te recv/tuku (5-10%) me te whakaiti i te utu ina whakamahi i nga miro (2-3%) . Ko te pikinga o nga mahi katoa i muri i te arotautanga o te waehere ko te 55%, me te pikinga mai i te 224k req/s ki te 347k req/s.
  • Monokia te whakamarumaru ki nga whakaraeraetanga o te mahi whakapae. Ma te whakamahi i nga tawhā “nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off” i te wa e utaina ana te kernel ka whakaaetia kia piki ake te mahi ma te 28%, ka piki te puta mai i te 347k req/s ki te 446k req/s. I wehea, ko te pikinga mai i te tawhā “nospectre_v1” (te parenga mai i te Specter v1 + SWAPGS) he 1-2%, “nospectre_v2” (te parenga mai i te Specter v2) - 15-20%, "pti=off" (Spectre v3/Meltdown) - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload and TSX Asynchronous Abort) - 6%. Ko nga tautuhinga mo te whakamarumaru mai i te L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass me nga whakaeke SRBDS i waiho kia kaua e whakarereke, kaore i pa ki te mahi na te mea kaore i whiti ki te whirihoranga kua whakamatauria (hei tauira, motuhake ki te KVM, kua kohanga. mariko me etahi atu tauira CPU).
  • Ko te whakakore i nga tikanga aukati waea me nga punaha ma te whakamahi i te whakahau "auditctl -a never,task" me te tautuhi i te "--security-opt seccomp=unconfined" i te wa e timata ana te ipu docker. Ko te pikinga o nga mahi katoa ko te 11%, me te pikinga mai i te 446k req/s ki te 495k req/s.
  • Ko te whakakore i nga iptables/netfilter ma te tango i nga waahanga kernel e hono ana. Ko te whakaaro ki te whakakore i te papangaahi, kaore i whakamahia i roto i tetahi otinga tūmau motuhake, i akiakihia e nga hua tohu, na te mea i tangohia e te mahi nf_hook_slow te 18% o te wa ki te mahi. Kei te tohuhia he pai ake te mahi a nga nftables i nga iptables, engari kei te whakamahi tonu a Amazon Linux i nga iptables. I muri i te whakakore i nga iptables, he 22% te pikinga o nga mahi, a, ka piki ake te whakaputanga mai i te 495k req/s ki te 603k req/s.
  • Kua whakahekehia te hekenga o nga kaikawe i waenga i nga momo CPU hei whakapai ake i te pai o te whakamahi keteroki tukatuka. I whakahaeretia te arotautanga i te taumata o te here i nga tikanga koreactor ki nga uho PTM (CPU Pinning) me te titi i nga kaikawe whatunga kernel (Whiwhi Tauine Taha). Hei tauira, i monoa te irqbalance me te hononga hono ki te PTM i tino whakatakotohia ki /proc/irq/$IRQ/smp_affinity_list. Hei whakamahi i te matua PTM kotahi ki te tukatuka i te tukanga freeactor me te rarangi whatunga o nga paatete taumai, ka whakamahia he kaihautu BPF ritenga, hono ma te tautuhi i te haki SO_ATTACH_REUSEPORT_CBPF i te wa e hanga ana te turanga. Hei here i nga rarangi o nga putea puta ki te PTM, kua whakarereketia nga tautuhinga /sys/class/net/eth0/queues/tx- /xps_cpus. Ko te pikinga o nga mahi katoa he 38%, me te pikinga mai i te 603k req/s ki te 834k req/s.
  • Te arotautanga o te whakahaere haukoti me te whakamahi i te pooti. Ko te whakahohe i te aratau adaptive-rx i roto i te taraiwa ENA me te raweke i te sysctl net.core.busy_read i piki ake te mahi ma te 28% (kua piki te puta mai i te 834k req/s ki te 1.06M req/s, ka heke te torohūtanga mai i te 361μs ki te 292μs).
  • Te whakakore i nga ratonga punaha e arai ana ki te aukati koretake i roto i te puranga whatunga. Ko te whakakore i te dhclient me te tautuhi-a-ringa i te wahitau IP i hua ake te 6% te pikinga mahi me te pikinga mai i te 1.06M req/s ki te 1.12M req/s. Ko te take e pa ana te dhclient ki te mahi i roto i te tātari waka ma te whakamahi i te turanga mata.
  • Te whawhai ki te raka hurihuri. Ko te whakawhiti i te puranga whatunga ki te aratau "noqueue" ma te sysctl "net.core.default_qdisc=noqueue" me te "tc qdisc replace dev eth0 root mq" i arahina ki te 2% te pikinga o te mahi, me te pikinga o te hua mai i te 1.12M req/s ki te 1.15M req/s.
  • Nga arotautanga iti whakamutunga, penei i te whakakore i te GRO (Generic Receive Offload) me te whakahau "ethtool -K eth0 gro off" me te whakakapi i te algorithm mana popoketanga ki te reno ma te whakamahi i te sysctl "net.ipv4.tcp_congestion_control=reno". Ko te pikinga hua katoa ko te 4%. I piki ake te urunga mai i te 1.15M req/s ki te 1.2M req/s.

I tua atu i nga arotautanga i mahi, ka korero ano te tuhinga i nga tikanga kaore i arahi ki te pikinga o nga mahi e tumanakohia ana. Hei tauira, ko nga mea e whai ake nei kaore i whai hua:

  • Ko te whakahaere i te freeactor motuhake kaore i rereke te mahi mai i te whakahaere i roto i te ipu. Ko te whakakapi i te writev ki te tuku, te whakanui ake i nga maxevents i roto i te epoll_wait, me te whakamatautau ki nga putanga GCC me nga haki kaore i whai hua (ka kitea te paanga mo nga haki "-O3" me "-march-native" anake).
  • Ko te whakahou ake i te kakano Linux ki nga putanga 4.19 me te 5.4, ma te whakamahi i te SCHED_FIFO me te SCHED_RR kaihōtaka, te raweke i te sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=kore rawa, skew_tick=1 me te karaka karaka mahi=tsc.
  • I roto i te atekōkiri ENA, te whakahohe i nga aratau Whakaekea (waahanga, scatter-gather, rx/tx checksum), te hanga me te haki “-O3”, me te whakamahi i te ena.rx_queue_size me te ena.force_large_llq_header tawhā kaore he painga.
  • Ko nga huringa i roto i te puranga whatunga kaore i pai ake te mahi:
    • Monokia IPv6: ipv6.disable=1
    • Monokia te VLAN: modprobe -rv 8021q
    • Monokia te tirotiro i te puna mokihi
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (pānga tōraro)
    • 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

Tāpiri i te kōrero