Linuxni soniyada 1.2 million JSON so'rovlarini bajarish uchun optimallashtirish

HTTP so'rovlarini qayta ishlash uchun maksimal ishlashga erishish uchun Linux muhitini sozlash bo'yicha batafsil qo'llanma chop etildi. Taklif etilgan usullar Amazon EC2 muhitida (4 vCPU) libreactor kutubxonasi asosidagi JSON protsessorining unumdorligini sekundiga 224 ming API so'rovidan Amazon Linux 2 yadrosi 4.14 yadroli standart sozlamalari bilan 1.2 million so'rovgacha oshirish imkonini berdi. optimallashtirishdan keyin ikkinchi o'rinni egalladi (436% ga o'sish), shuningdek, so'rovlarni ko'rib chiqishdagi kechikishlarning 79% ga qisqarishiga olib keldi. Taklif etilayotgan usullar libreactorga xos emas va boshqa http-serverlardan, jumladan nginx, Actix, Netty va Node.js-dan foydalanganda ishlaydi (libreaktor sinovlarda ishlatilgan, chunki unga asoslangan yechim yaxshi ishlashni ko'rsatdi).

Linuxni soniyada 1.2 million JSON so'rovlarini bajarish uchun optimallashtirish

Asosiy optimallashtirish:

  • Libreaktor kodini optimallashtirish. Techempower to'plamidagi R18 opsiyasi asos sifatida ishlatilgan, bu ishlatiladigan protsessor yadrolari sonini cheklash uchun kodni olib tashlash orqali takomillashtirildi (optimallashtirish ishni 25-27% ga tezlashtirishga imkon berdi va GCC-da "-O3" variantlari bilan yig'ildi. (5-10% ga o'sish) va "-march-native" (5-10%), o'qish/yozish qo'ng'iroqlarini recv/send (5-10%) bilan almashtirish va pthreadlardan foydalanishda qo'shimcha xarajatlarni kamaytirish (2-3%) . Kodni optimallashtirishdan so'ng umumiy ishlash o'sishi 55% ni tashkil etdi va o'tkazish qobiliyati 224k req/s dan 347k req/s gacha oshdi.
  • Spekulyativ ijro zaifliklaridan himoyani o'chiring. Yadroni yuklashda “nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off” parametrlaridan foydalanish unumdorlikni 28% ga oshirish imkonini berdi va o‘tkazish qobiliyati 347k req/s dan 446k req/s ga oshdi. Alohida, “nospectre_v1” (Spectre v1 + SWAPGS dan himoya) parametridan o‘sish 1-2%, “nospectre_v2” (Spectre v2 dan himoya) - 15-20%, “pti=off” (Spectre v3/Meltdown) ni tashkil etdi. - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload va TSX Asinxron Abort) - 6%. L1TF/Foreshadow (l1tf=flush), iTLB multihit, spekulyativ do'konni aylanib o'tish va SRBDS hujumlaridan himoya qilish sozlamalari o'zgarishsiz qoldirildi, bu esa ishlashga ta'sir qilmadi, chunki ular sinovdan o'tgan konfiguratsiya bilan kesishmagan (masalan, KVMga xos, ichki o'rnatilgan virtualizatsiya va boshqa CPU modellari).
  • Docker konteynerini ishga tushirishda "auditctl -a never,task" buyrug'i va "--security-opt seccomp=unconfined" opsiyasidan foydalangan holda audit va tizim chaqiruvlarini blokirovka qilish mexanizmlarini o'chirib qo'yish. Umumiy unumdorlik o'sishi 11% ni tashkil etdi va o'tkazish qobiliyati 446k req/s dan 495k req/s gacha oshdi.
  • Tegishli yadro modullarini tushirish orqali iptables/netfilterni o'chirish. Muayyan server yechimida foydalanilmagan xavfsizlik devorini o'chirish g'oyasi natijalarni profillash orqali, nf_hook_slow funksiyasini bajarish uchun vaqtning 18% vaqtini olgan. Qayd etilishicha, nftables iptables’ga qaraganda samaraliroq ishlaydi, biroq Amazon Linux iptables’dan foydalanishda davom etmoqda. Iptablesni o'chirib qo'ygandan so'ng, unumdorlik o'sishi 22% ni tashkil etdi va o'tkazish qobiliyati 495k req/s dan 603k req/s gacha oshdi.
  • Protsessor keshidan foydalanish samaradorligini oshirish uchun turli protsessor yadrolari o'rtasida ishlov beruvchilarning migratsiyasi kamaytirildi. Optimallashtirish libreaktor jarayonlarini protsessor yadrolari bilan bog'lash darajasida ham (CPU Pinning) va yadro tarmog'ini qayta ishlovchilarni mahkamlash (Receive Side Scaling) orqali amalga oshirildi. Misol uchun, irqbalance o'chirilgan va navbatdagi protsessorga yaqinlik /proc/irq/$IRQ/smp_affinity_list-da aniq o'rnatilgan. Libreaktor jarayonini va kiruvchi paketlarning tarmoq navbatini qayta ishlash uchun bir xil CPU yadrosidan foydalanish uchun rozetkani yaratishda SO_ATTACH_REUSEPORT_CBPF bayrog'ini o'rnatish orqali ulangan maxsus BPF ishlov beruvchisi ishlatiladi. Chiquvchi paketlarning navbatlarini protsessorga ulash uchun /sys/class/net/eth0/queues/tx- sozlamalari o'zgartirildi. /xps_cpus. Umumiy unumdorlik o'sishi 38% ni tashkil etdi va o'tkazish qobiliyati 603k req/s dan 834k req/s gacha oshdi.
  • Uzilishlarni boshqarish va so'rovdan foydalanishni optimallashtirish. ENA drayverida adaptiv-rx rejimini yoqish va sysctl net.core.busy_read bilan manipulyatsiya qilish unumdorlikni 28% ga oshirdi (o‘tkazish qobiliyati 834k req/s dan 1.06M req/s ga oshdi va kechikish 361mks dan 292mks gacha kamaydi).
  • Tarmoq to'plamida keraksiz blokirovkaga olib keladigan tizim xizmatlarini o'chirish. dhclient-ni o'chirib qo'yish va IP-manzilni qo'lda o'rnatish unumdorlikni 6% ga oshirishga olib keldi va o'tkazish qobiliyati 1.06M req/s dan 1.12M req/s gacha oshdi. Dhclient unumdorligiga ta'sir qilishining sababi xom rozetkadan foydalangan holda trafikni tahlil qilishdir.
  • Spin Lock bilan kurashish. Tarmoq stekini sysctl “net.core.default_qdisc=noqueue” va “tc qdisc replace dev eth0 root mq” orqali “noqueue” rejimiga o‘tkazish unumdorlikni 2% ga oshirishga olib keldi va o‘tkazish qobiliyati 1.12M req/s dan 1.15M gacha oshdi. talab/s.
  • Yakuniy kichik optimallashtirishlar, masalan, “ethtool -K eth0 gro off” buyrug‘i bilan GRO (Generic Receive Offload) funksiyasini o‘chirish va sysctl “net.ipv4.tcp_congestion_control=reno” yordamida kubik tiqilib qolishni boshqarish algoritmini reno bilan almashtirish. Umumiy hosildorlik o'sishi 4% ni tashkil etdi. O'tkazish qobiliyati 1.15M req/s dan 1.2M req/s gacha oshdi.

Ishlagan optimallashtirishlardan tashqari, maqolada kutilgan samaradorlikni oshirishga olib kelmagan usullar ham muhokama qilinadi. Masalan, quyidagilar samarasiz bo'lib chiqdi:

  • Libreaktorni alohida ishga tushirish unumdorligi jihatidan uni konteynerda ishlatishdan farq qilmadi. writev-ni yuborish bilan almashtirish, epoll_wait-da maksimal hodisalarni oshirish va GCC versiyalari va bayroqlari bilan tajriba o'tkazish hech qanday ta'sir ko'rsatmadi (ta'sir faqat "-O3" va "-march-native" bayroqlari uchun sezilarli edi).
  • Linux yadrosini 4.19 va 5.4 versiyalariga yangilash, SCHED_FIFO va SCHED_RR rejalashtiruvchilari yordamida, sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=nevertic va clockning ishlashiga ta'sir qilmadi=kts.
  • ENA drayverida tushirish rejimlarini yoqish (segmentatsiya, scatter-to'plash, rx/tx nazorat summasi), "-O3" bayrog'i bilan qurish va ena.rx_queue_size va ena.force_large_llq_header parametrlaridan foydalanish hech qanday ta'sir ko'rsatmadi.
  • Tarmoq stekidagi o'zgarishlar ishlashni yaxshilamadi:
    • IPv6-ni o'chirish: ipv6.disable=1
    • VLAN-ni o'chiring: modprobe -rv 8021q
    • Paket manbasini tekshirishni o'chirib qo'ying
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (salbiy ta'sir)
    • 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

    Manba: opennet.ru

a Izoh qo'shish