Секундасына 1.2 миллион JSON сурамдарын аткаруу үчүн Linux оптималдаштыруу

HTTP сурамдарын иштетүү үчүн максималдуу өндүрүмдүүлүккө жетишүү үчүн Linux чөйрөсүн тууралоо боюнча кеңири жол басылып чыкты. Сунушталган ыкмалар Amazon EC2 чөйрөсүндөгү (4 vCPU) libreactor китепканасынын негизинде JSON процессорунун иштөөсүн секундасына 224 миң API суроосунан Amazon Linux 2 стандарттык жөндөөлөрү менен 4.14 ядросу менен 1.2 миллион суроого чейин жогорулатууга мүмкүндүк берди. оптималдаштыруудан кийин экинчи (436% га өсүү), ошондой эле 79% га суроо-талаптарды иштеп чыгуу кечигүүлөрүнүн кыскарышына алып келди. Сунушталган ыкмалар libreactor үчүн мүнөздүү эмес жана башка http серверлерин, анын ичинде nginx, Actix, Netty жана Node.js колдонууда иштейт (либреактор тесттерде колдонулган, анткени ага негизделген чечим жакшыраак өндүрүмдүүлүктү көрсөткөн).

Секундасына 1.2 миллион JSON сурамдарын аткаруу үчүн Linux оптималдаштыруу

Негизги оптималдаштыруу:

  • Либреактордун кодун оптималдаштыруу. Techempower комплектинен R18 опциясы негиз катары колдонулган, ал колдонулган CPU өзөктөрүнүн санын чектөө үчүн кодду алып салуу менен жакшыртылды (оптималдаштыруу ишти 25-27% га тездетүүгө мүмкүндүк берди), "-O3" опциялары менен GCCде чогултулду. (5-10% га өсүү ) жана "-марш-натив" (5-10%), окуу/жазуу чалууларын recv/send (5-10%) менен алмаштыруу жана pthreads колдонууда кошумча чыгымдарды азайтуу (2-3%) . Кодду оптималдаштыруудан кийин жалпы өндүрүмдүүлүктүн жогорулашы 55% түздү жана өткөрүү жөндөмдүүлүгү 224k req/s дан 347k req/s чейин көбөйдү.
  • Спекуляциялык аткаруунун алсыздыктарынан коргоону өчүрүү. Ядрону жүктөөдө “nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off” параметрлерин колдонуу өндүрүмдүүлүктү 28% га жогорулатууга мүмкүндүк берди, ал эми өткөрүү жөндөмдүүлүгү 347k req/s дан 446k req/s чейин көбөйдү. Өзүнчө, "nospectre_v1" параметринен (Spectre v1 + SWAPGSден коргоо) өсүү 1-2%, "nospectre_v2" (Spectre v2ден коргоо) - 15-20%, "pti=off" (Spectre v3/Meltdown) - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload жана TSX асинхрондук токтотуу) - 6%. L1TF/Foreshadow (l1tf=flush), iTLB multihit, Спекуляциялык дүкөндү айланып өтүү жана SRBDS чабуулдарынан коргоо жөндөөлөрү өзгөрүүсүз калтырылды, алар сыналган конфигурация менен кесилишкен эмес (мисалы, KVM үчүн өзгөчө, уя салынган) виртуалдаштыруу жана башка CPU моделдери).
  • Докер контейнерин ишке киргизүүдө "auditctl -a never,task" буйругун колдонуу жана "--security-opt seccomp=unconfined" опциясын көрсөтүү аркылуу текшерүү жана тутумдук чалууларды бөгөттөө механизмдерин өчүрүү. Жалпы өндүрүмдүүлүктүн өсүшү 11% түздү, ал эми өткөрүү жөндөмдүүлүгү 446 миң рек/секден 495 миң рек/сек чейин көбөйдү.
  • Байланышкан ядро ​​модулдарын түшүрүү менен iptables/netfilterди өчүрүү. Белгилүү бир сервердик чечимде колдонулбаган брандмауэрди өчүрүү идеясы nf_hook_slow функциясын аткарууга убакыттын 18% ын талап кылган натыйжаларды профилдештирүү менен шартталган. Бул nftables iptables караганда натыйжалуу иштейт деп белгиленет, бирок Amazon Linux iptables колдонууну улантууда. Iptables өчүрүлгөндөн кийин, өндүрүмдүүлүктүн өсүшү 22% түздү жана өткөрүү жөндөмдүүлүгү 495k req/s дан 603k req/s чейин өстү.
  • Процессордун кэшин колдонуунун натыйжалуулугун жогорулатуу үчүн ар кандай CPU өзөктөрүнүн ортосундагы иштетүүчүлөрдүн миграциясы кыскарды. Оптималдаштыруу процессордун өзөктөрүнө либреактордун процесстерин бириктирүү деңгээлинде да (CPU Pinning) жана өзөк тармагынын иштеткичтерин кадоо (Receive Side Scaling) аркылуу ишке ашырылган. Мисалы, irqbalance өчүрүлгөн жана процессорго кезек жакындыгы /proc/irq/$IRQ/smp_affinity_list ичинде ачык коюлган. Либреактор процессин жана келген пакеттердин тармак кезегин иштетүү үчүн ошол эле CPU өзөгүн колдонуу үчүн розетка түзүүдө SO_ATTACH_REUSEPORT_CBPF желегин орнотуу менен туташтырылган BPF иштеткич колдонулат. Процессорго чыгуучу пакеттердин кезектерин туташтыруу үчүн /sys/class/net/eth0/queues/tx- жөндөөлөрү өзгөртүлдү. /xps_cpus. Жалпы өндүрүмдүүлүктүн өсүшү 38% түздү, ал эми өткөрүү жөндөмдүүлүгү 603 миң рек/секден 834 миң рек/сек чейин көбөйдү.
  • Үзгүлтүктөрдү башкарууну жана добуш берүүнү колдонууну оптималдаштыруу. ENA драйверинде адаптивдик-rx режимин иштетүү жана sysctl net.core.busy_read манипуляциялоо майнаптуулукту 28% га жогорулатты (өткөрүү 834к рек/секден 1.06М рек/сек чейин көбөйдү, ал эми күтүү 361мкстен 292мкс чейин төмөндөдү).
  • Тармак стекинде ашыкча бөгөт коюуга алып келген тутум кызматтарын өчүрүү. dhclientди өчүрүү жана IP дарегин кол менен коюу 6% га өндүрүмдүүлүктүн жогорулашына алып келди жана өткөрүү жөндөмдүүлүгү 1.06M req/s дан 1.12M req/s чейин көбөйдү. Dhclientтин иштешине таасир эткенинин себеби - чийки розетка аркылуу трафикти талдоо.
  • Fighting Spin Lock. Тармак стектерин sysctl “net.core.default_qdisc=noqueue” жана “tc qdisc dev eth0 root mq алмаштыруу” аркылуу “noqueue” режимине которуу өндүрүмдүүлүктүн 2% жогорулашына алып келди жана өткөрүү жөндөмдүүлүгү 1.12M req/s дан 1.15Mге чейин көбөйдү. талап/с.
  • “ethtool -K eth0 gro off” буйругу менен GRO (Generic Receive Offload) функциясын өчүрүү жана sysctl “net.ipv4.tcp_congestion_control=reno” аркылуу кубдук тыгынды көзөмөлдөө алгоритмин reno менен алмаштыруу сыяктуу акыркы майда оптималдаштыруулар. Жалпы эмгек ендурумдуулугунун есушу 4 процентти тузду. Өткөрүү жөндөмдүүлүгү 1.15 миллион рек/секден 1.2 миллион рек/сек чейин көбөйдү.

Иштеген оптималдаштыруудан тышкары, макалада күтүлгөн натыйжалуулукту жогорулатууга алып келбеген ыкмалар да талкууланат. Мисалы, төмөнкү натыйжасыз болуп чыкты:

  • Либреакторду өзүнчө иштетип, аны контейнерде иштетүүдөн айырмаланган эмес. writevди жөнөтүү менен алмаштыруу, epoll_wait ичиндеги максималдуу окуяларды көбөйтүү жана GCC версиялары жана желектери менен эксперимент эч кандай натыйжа берген жок (эффект “-O3” жана “-march-native” желектеринде гана байкалды).
  • Linux ядросун 4.19 жана 5.4 версияларына жаңыртуу, SCHED_FIFO жана SCHED_RR пландоочуларын колдонуу, sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=never жана сааттын иштешине таасир этпейт=k1, s=kkXNUMX.
  • ENA драйверинде түшүрүү режимдерин иштетүү (сегментация, чачыратуу-жыйноо, rx/tx текшерүү суммасы), “-O3” желеги менен куруу жана ena.rx_queue_size жана ena.force_large_llq_header параметрлерин колдонуу эч кандай таасир тийгизген жок.
  • Тармак стекиндеги өзгөртүүлөр майнаптуулукту жакшырткан жок:
    • IPv6 өчүрүү: ipv6.disable=1
    • VLANды өчүрүү: modprobe -rv 8021q
    • Пакет булагын текшерүүнү өчүрүү
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (терс таасир)
    • 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

Комментарий кошуу