Ngaoptimalkeun Linux pikeun nanganan 1.2 juta pamundut JSON per detik

Pitunjuk anu lengkep parantos diterbitkeun dina nyetél lingkungan Linux pikeun ngahontal prestasi maksimal pikeun ngolah pamundut HTTP. Metodeu anu diusulkeun ngamungkinkeun pikeun ningkatkeun kinerja prosésor JSON dumasar kana perpustakaan libreactor di lingkungan Amazon EC2 (4 vCPU) tina 224 rébu paménta API per detik kalayan setélan standar Amazon Linux 2 kalayan kernel 4.14 dugi ka 1.2 juta pamundut per detik. kadua sanggeus optimasi (kanaékan 436%), sarta ogé ngarah ka réduksi dina reureuh dina requests processing ku 79%. Metodeu anu diusulkeun henteu khusus pikeun libreactor sareng dianggo nalika nganggo server http anu sanés, kalebet nginx, Actix, Netty sareng Node.js (libreactor dianggo dina tés kusabab solusi dumasar kana éta nunjukkeun kinerja anu langkung saé).

Ngaoptimalkeun Linux pikeun nanganan 1.2 juta pamundut JSON per detik

Optimasi dasar:

  • Ngaoptimalkeun kode libreactor. Pilihan R18 ti Techmpower kit ieu dipaké salaku dadasar, nu ieu ningkat ku nyoplokkeun kode pikeun ngawatesan jumlah cores CPU dipaké (optimasi diwenangkeun ngagancangkeun karya ku 25-27%), assembling di GCC kalawan pilihan "-O3". (paningkatan 5-10%) jeung "-march-pribumi" (5-10%), ngaganti maca / nulis panggero kalawan recv / ngirim (5-10%) jeung ngurangan overhead nalika maké pthreads (2-3%) . Paningkatan kinerja sakabéh sanggeus optimasi kode éta 55%, sarta throughput ngaronjat tina 224k req / s ka 347k req / s.
  • Pareuman panyalindungan ngalawan kerentanan palaksanaan spekulatif. Ngagunakeun parameter "nospectre_v1 nospectre_v2 pti = off mds = off tsx_async_abort = off" lamun loading kernel diwenangkeun pikeun ngaronjatkeun kinerja ku 28%, sarta throughput ngaronjat tina 347k req / s ka 446k req / s. Kapisah, kanaékan tina parameter "nospectre_v1" (perlindungan ti Spectre v1 + SWAPGS) éta 1-2%, "nospectre_v2" (perlindungan tina Specter v2) - 15-20%, "pti = off" (Spectre v3 / Meltdown) - 6 %, "mds = off tsx_async_abort = off" (MDS/Zombieload jeung TSX Asynchronous Abort) - 6%. Setélan pikeun panangtayungan ngalawan L1TF / Foreshadow (l1tf = siram), iTLB multihit, Spekulatif Toko Bypass sarta serangan SRBDS ditinggalkeun unchanged, nu teu mangaruhan kinerja saprak maranéhna teu motong jeung konfigurasi diuji (contona, husus pikeun KVM, nested). virtualization jeung model CPU lianna).
  • Nonaktipkeun auditing sareng mékanisme pameungpeuk sauran sistem nganggo paréntah "auditctl -a pernah, tugas" sareng netepkeun pilihan "--security-opt seccomp = unconfined" nalika ngamimitian wadah docker. Kanaékan kinerja sakabéh éta 11%, sarta throughput ngaronjat tina 446k req / s ka 495k req / s.
  • Nonaktipkeun iptables / netfilter ku ngabongkar modul kernel anu aya hubunganana. Gagasan pikeun nganonaktipkeun firewall, anu henteu dianggo dina solusi server anu khusus, dipenta ku hasil profil, ditilik ku fungsi nf_hook_slow nyandak 18% waktos pikeun dieksekusi. Ieu dicatet yén nftables jalan leuwih éfisién ti iptables, tapi Amazon Linux Ubuntu terus ngagunakeun iptables. Saatos nganonaktipkeun iptables, paningkatan kinerja 22%, sareng throughput ningkat tina 495k req / s ka 603k req / s.
  • Ngurangan migrasi pawang antara cores CPU béda pikeun ngaronjatkeun efisiensi pamakéan cache processor. Optimasi dilaksanakeun duanana dina tingkat ngariung prosés libreactor kana inti CPU (CPU Pinning) jeung ngaliwatan pinning pawang jaringan kernel (Narima Skala Sisi). Salaku conto, irqbalance ditumpurkeun sareng antrian antrian ka CPU sacara eksplisit disetél dina /proc/irq/$IRQ/smp_affinity_list. Pikeun nganggo inti CPU anu sami pikeun ngolah prosés libreactor sareng antrian jaringan pakét anu datang, panangan BPF adat dianggo, dihubungkeun ku netepkeun bendera SO_ATTACH_REUSEPORT_CBPF nalika nyiptakeun stop kontak. Pikeun ngabeungkeut antrian pakét kaluar ka CPU, setélan /sys/class/net/eth0/queues/tx- geus dirobah. /xps_cpus. Kanaékan kinerja sakabéh éta 38%, sarta throughput ngaronjat tina 603k req / s ka 834k req / s.
  • Optimasi penanganan interupsi sareng panggunaan polling. Aktipkeun mode adaptif-rx dina supir ENA sareng ngamanipulasi sysctl net.core.busy_read ningkat prestasi ku 28% (throughput ningkat tina 834k req / s ka 1.06M req / s, sareng latency turun tina 361μs ka 292μs).
  • Nonaktipkeun jasa sistem nu ngakibatkeun blocking teu perlu dina tumpukan jaringan. Nganonaktipkeun dhclient sareng netepkeun alamat IP sacara manual nyababkeun paningkatan kinerja 6% sareng throughput ningkat tina 1.06M req / s ka 1.12M req / s. Alesan dhclient mangaruhan kinerja dina analisis lalulintas ngagunakeun stop kontak atah.
  • Ngalawan Spin Konci. Ngalihkeun tumpukan jaringan kana mode "noqueue" via sysctl "net.core.default_qdisc=noqueue" sareng "tc qdisc ngagantikeun dev eth0 root mq" nyababkeun kanaékan kinerja 2%, sareng throughput ningkat tina 1.12M req / s ka 1.15M req/s.
  • Optimasi minor final, kayaning nganonaktipkeun GRO (Generik Narima Offload) kalawan paréntah "ethtool -K eth0 gro off" jeung ngaganti algoritma kontrol kamacetan kubik kalawan reno maké sysctl "net.ipv4.tcp_congestion_control = Reno". Kanaékan produktivitas sakabéh éta 4%. Throughput ngaronjat tina 1.15M req / s ka 1.2M req / s.

Salian optimasi anu digarap, artikel ogé ngabahas métode anu henteu ngakibatkeun kanaékan kinerja ekspektasi. Contona, di handap tétéla teu epektip:

  • Ngajalankeun libreactor sacara misah henteu béda dina pagelaran sareng ngajalankeunana dina wadah. Ngaganti writev kalawan ngirim, ngaronjatkeun maxevents di epoll_wait, sarta ékspérimén kalawan versi GCC jeung bandéra teu boga pangaruh (éfék éta noticeable ukur keur "-O3" jeung "-march-pribumi" umbul).
  • Ngaronjatkeun kernel Linux Ubuntu kana vérsi 4.19 jeung 5.4, ngagunakeun SCHED_FIFO na SCHED_RR schedulers, manipulasi sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages = pernah, skew_tick = 1 jeung clocksource = tsc teu mangaruhan kinerja.
  • Dina supir ENA, ngaktipkeun mode Offload (segmentasi, paburencay-kumpul, rx / tx checksum), ngawangun kalawan "-O3" bandéra, sarta ngagunakeun ena.rx_queue_size na ena.force_large_llq_header parameter teu boga pangaruh.
  • Parobahan dina tumpukan jaringan henteu ningkatkeun kinerja:
    • Pareuman IPv6: ipv6.disable=1
    • Nonaktipkeun VLAN: modprobe -rv 8021q
    • Nonaktipkeun pamariksaan sumber pakét
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (pangaruh négatip)
    • 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

    sumber: opennet.ru

Tambahkeun komentar