Saniyədə 1.2 milyon JSON sorğusunu idarə etmək üçün Linux optimallaşdırılması

HTTP sorğularını emal etmək üçün maksimum performansa nail olmaq üçün Linux mühitinin sazlanmasına dair ətraflı təlimat dərc edilmişdir. Təklif olunan üsullar Amazon EC2 mühitində (4 vCPU) libreaktor kitabxanasına əsaslanan JSON prosessorunun işini kernel 224 olan Amazon Linux 2-nin standart parametrləri ilə saniyədə 4.14 min API sorğusundan 1.2 milyon sorğuya qədər artırmağa imkan verdi. optimallaşdırmadan sonra ikinci (artım 436%), həmçinin sorğuların emalında gecikmələrin 79% azalmasına səbəb oldu. Təklif olunan üsullar libreactor üçün xüsusi deyil və nginx, Actix, Netty və Node.js daxil olmaqla, digər http serverlərindən istifadə zamanı işləyir (bunun əsasında hazırlanmış həll daha yaxşı performans göstərdiyi üçün sınaqlarda libreaktor istifadə edilmişdir).

Saniyədə 1.2 milyon JSON sorğusunu idarə etmək üçün Linux optimallaşdırılması

Əsas optimallaşdırmalar:

  • Libreaktor kodunun optimallaşdırılması. Techempower dəstindən R18 seçimi əsas kimi istifadə edildi, istifadə olunan CPU nüvələrinin sayını məhdudlaşdırmaq üçün kodun çıxarılması ilə təkmilləşdirildi (optimallaşdırma işi 25-27% sürətləndirməyə imkan verdi, "-O3" seçimləri ilə GCC-də yığıldı. (artım 5-10% ) və "-march-native" (5-10%), oxu/yazma zənglərini recv/send (5-10%) ilə əvəz edir və pthreads istifadə edərkən əlavə xərcləri azaldır (2-3%) . Kodun optimallaşdırılmasından sonra ümumi performans artımı 55% təşkil etdi və ötürmə qabiliyyəti 224k req/s-dən 347k req/s-ə yüksəldi.
  • Spekulyativ icra zəifliklərinə qarşı müdafiəni söndürün. Kerneli yükləyərkən “nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off” parametrlərindən istifadə məhsuldarlığı 28% artırmağa imkan verdi və ötürmə qabiliyyəti 347k req/s-dən 446k req/s-ə yüksəldi. Ayrı olaraq, “nospectre_v1” (Spectre v1 + SWAPGS-dən qorunma) parametrindən artım 1-2%, “nospectre_v2” (Spectre v2-dən qorunma) - 15-20%, “pti=off” (Spectre v3/Meltdown) olmuşdur. - 6 %, "mds=off tsx_async_abort=off" (MDS/Zombieload və TSX Asynchronous Abort) - 6%. L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass və SRBDS hücumlarına qarşı qorunma parametrləri dəyişməz qaldı, çünki onlar sınaqdan keçirilmiş konfiqurasiya ilə kəsişmədiyinə görə (məsələn, KVM-ə xas, iç-içə quraşdırılmış) performansa təsir göstərmir. virtuallaşdırma və digər CPU modelləri).
  • Docker konteynerini işə salarkən "auditctl -a never,task" əmrindən istifadə edərək audit və sistem çağırışının bloklanması mexanizmlərini söndürmək və "--security-opt seccomp=unconfined" seçimini təyin etmək. Ümumi performans artımı 11% təşkil edib və ötürmə qabiliyyəti 446k req/s-dən 495k req/s-ə yüksəlib.
  • Əlaqədar kernel modullarını boşaltmaqla iptables/netfilter-in söndürülməsi. Müəyyən bir server həllində istifadə olunmayan firewall-u söndürmək ideyası, nf_hook_slow funksiyasının icrası üçün vaxtın 18%-ni sərf etdiyinə görə nəticələrin profilləşdirilməsi ilə ortaya çıxdı. Qeyd olunur ki, nftables iptables-dən daha səmərəli işləyir, lakin Amazon Linux iptables-dən istifadə etməyə davam edir. İptables-i söndürdükdən sonra performans artımı 22% təşkil etdi və ötürmə qabiliyyəti 495k req/s-dən 603k req/s-ə yüksəldi.
  • Prosessor keşinin istifadəsinin səmərəliliyini artırmaq üçün müxtəlif CPU nüvələri arasında işləyicilərin miqrasiyasının azaldılması. Optimallaşdırma həm libreaktor proseslərinin CPU nüvələrinə bağlanması səviyyəsində (CPU Pinning), həm də nüvə şəbəkə işləyicilərinin bağlanması (Receive Side Scaling) vasitəsilə həyata keçirilib. Məsələn, irqbalance söndürüldü və CPU ilə növbə yaxınlığı açıq şəkildə /proc/irq/$IRQ/smp_affinity_list-də təyin edildi. Libreaktor prosesini və daxil olan paketlərin şəbəkə növbəsini emal etmək üçün eyni CPU nüvəsindən istifadə etmək üçün yuvanı yaratarkən SO_ATTACH_REUSEPORT_CBPF bayrağını təyin etməklə qoşulmuş xüsusi BPF işləyicisi istifadə olunur. Gedən paketlərin növbələrini CPU-ya bağlamaq üçün /sys/class/net/eth0/queues/tx- parametrləri dəyişdirildi. /xps_cpus. Ümumi performans artımı 38% təşkil edib və ötürmə qabiliyyəti 603k req/s-dən 834k req/s-ə yüksəlib.
  • Kesintilərin idarə edilməsi və sorğudan istifadənin optimallaşdırılması. ENA drayverində adaptiv-rx rejimini aktivləşdirmək və sysctl net.core.busy_read ilə manipulyasiya etmək performansı 28% artırdı (keçirmə qabiliyyəti 834k req/s-dən 1.06M req/s-ə yüksəldi və gecikmə 361μs-dən 292μs-ə qədər azaldı).
  • Şəbəkə yığınında lazımsız bloklamaya səbəb olan sistem xidmətlərinin söndürülməsi. dhclient-i söndürmək və IP ünvanını əl ilə təyin etmək performansın 6% artması ilə nəticələndi və ötürmə qabiliyyəti 1.06M req/s-dən 1.12M req/s-ə yüksəldi. dhclientin performansa təsir etməsinin səbəbi xam rozetkadan istifadə edərək trafik təhlilidir.
  • Spin Kilidi ilə mübarizə. Şəbəkə yığınının sysctl “net.core.default_qdisc=noqueue” və “tc qdisc dev eth0 root mq əvəz” vasitəsilə “noqueue” rejiminə keçirilməsi performansın 2% artmasına səbəb oldu və ötürmə qabiliyyəti 1.12M req/s-dən 1.15M-ə yüksəldi. tələb/s.
  • “ethtool -K eth0 gro off” əmri ilə GRO-nun (Ümumi Qəbul Boşaltma) söndürülməsi və sysctl “net.ipv4.tcp_congestion_control=reno” istifadə edərək kubik sıxlığa nəzarət alqoritminin reno ilə əvəz edilməsi kimi son kiçik optimallaşdırmalar. Ümumi məhsuldarlıq artımı 4 faiz təşkil etmişdir. Məhsuldarlıq 1.15M req/s-dən 1.2M req/s-ə yüksəldi.

İşləyən optimallaşdırmalara əlavə olaraq, məqalədə gözlənilən performans artımına səbəb olmayan üsullar da müzakirə olunur. Məsələn, aşağıdakılar təsirsiz oldu:

  • Ayrı-ayrılıqda işləyən libreaktor, bir konteynerdə işləməkdən performans baxımından fərqlənmirdi. writev-i göndərmə ilə əvəz etmək, epoll_wait-də maksimum hadisələri artırmaq və GCC versiyaları və bayraqları ilə sınaqdan keçirmək heç bir effekt vermədi (təsir yalnız “-O3” və “-march-native” bayraqları üçün nəzərə çarpırdı).
  • Linux nüvəsini 4.19 və 5.4 versiyalarına təkmilləşdirmək, SCHED_FIFO və SCHED_RR planlaşdırıcılarından istifadə etməklə, sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=nevertic və saat performansına təsir etmədi=kk1, manipulyasiya etmək.
  • ENA drayverində Boşaltma rejimlərinin işə salınması (seqmentləşdirmə, səpələnmə-toplama, rx/tx yoxlama cəmi), “-O3” bayrağı ilə qurulma və ena.rx_queue_size və ena.force_large_llq_header parametrlərindən istifadə heç bir təsir göstərmədi.
  • Şəbəkə yığınındakı dəyişikliklər performansı yaxşılaşdırmadı:
    • IPv6-nı söndürün: ipv6.disable=1
    • VLAN-ı söndürün: modprobe -rv 8021q
    • Paket mənbəyi yoxlamasını deaktiv edin
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (mənfi tə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

    Mənbə: opennet.ru

Добавить комментарий