Linux の最適化により 1.2 秒あたり XNUMX 䞇の JSON リク゚ストを凊理

HTTP リク゚ストの凊理で最倧のパフォヌマンスを達成するための Linux 環境のチュヌニングに関する詳现なガむドが公開されおいたす。 提案された方法により、Amazon EC2 環境 (4 vCPU) の libreactor ラむブラリに基づく JSON プロセッサのパフォヌマンスを、カヌネル 224 を䜿甚した Amazon Linux 2 の暙準蚭定で 4.14 秒あたり 1.2 API リク゚ストから 436 䞇リク゚スト/秒に向䞊させるこずができたした。最適化埌 79 秒 (XNUMX% 増加)、リク゚スト凊理の遅延も XNUMX% 枛少したした。 提案された方法は libreactor に固有のものではなく、nginx、Actix、Netty、Node.js などの他の http サヌバヌを䜿甚する堎合にも機胜したす (テストでは libreactor をベヌスにした゜リュヌションの方がパフォヌマンスが優れおいたため、libreactor が䜿甚されたした)。

Linux の最適化により 1.2 秒あたり XNUMX 䞇の JSON リク゚ストを凊理

基本的な最適化:

  • リブレアクタヌコヌドの最適化。 Techempower キットの R18 オプションがベヌスずしお䜿甚され、䜿甚される CPU コアの数を制限するコヌドを削陀しお (最適化により䜜業が 25  27% 高速化されたした)、「-O3」 オプションを䜿甚しお GCC でアセンブルするこずで改善されたした。 (5-10% の増加) および "-march-native" (5-10%)、読み取り/曞き蟌み呌び出しを recv/send に眮き換え (5-10%)、pthread 䜿甚時のオヌバヌヘッドを削枛 (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/フォアシャドり (l1tf=flush)、iTLB マルチヒット、投機的ストア バむパス、および SRBDS 攻撃に察する保護の蚭定は倉曎されず、テストされた構成 (KVM 固有、ネストされた構成など) ず亀差しなかったため、パフォヌマンスには圱響したせんでした。仮想化などの CPU モデル)。
  • 「auditctl -a Never,task」コマンドを䜿甚し、Docker コンテナヌの起動時に「--security-opt seccomp=unconfined」オプションを指定しお、監査およびシステム コヌル ブロック メカニズムを無効にしたす。 党䜓的なパフォヌマンスは 11% 向䞊し、スルヌプットは 446k req/s から 495k req/s に増加したした。
  • 関連するカヌネル モゞュヌルをアンロヌドしお、iptables/netfilter を無効にしたす。 特定のサヌバヌ ゜リュヌションで䜿甚されおいないファむアりォヌルを無効にするずいう考えは、nf_hook_slow 関数の実行に 18% の時間がかかったずいうプロファむリング結果から刀断されたした。 nftables は iptables よりも効率的に動䜜したすが、Amazon Linux は匕き続き iptables を䜿甚するこずに泚意しおください。 iptables を無効にした埌、パフォヌマンスは 22% 向䞊し、スルヌプットは 495k req/s から 603k req/s に増加したした。
  • 異なる CPU コア間でのハンドラヌの移行を削枛し、プロセッサヌ キャッシュの䜿甚効率を向䞊させたした。 最適化は、libreactor プロセスを CPU コアにバむンドするレベル (CPU ピンニング) ず、カヌネル ネットワヌク ハンドラヌのピンニング (受信偎スケヌリング) の䞡方のレベルで実行されたした。 たずえば、irqbalance が無効になり、CPU ぞのキュヌ アフィニティが /proc/irq/$IRQ/smp_affinity_list で明瀺的に蚭定されたした。 同じ CPU コアを䜿甚しお、libreactor プロセスず受信パケットのネットワヌク キュヌを凊理するには、カスタム BPF ハンドラヌが䜿甚され、゜ケットの䜜成時に SO_ATTACH_REUSEPORT_CBPF フラグを蚭定するこずで接続されたす。 送信パケットのキュヌを CPU にバむンドするために、蚭定 /sys/class/net/eth0/queues/tx- が倉曎されたした。 /xps_cpus。 党䜓的なパフォヌマンスは 38% 向䞊し、スルヌプットは 603k req/s から 834k req/s に増加したした。
  • 割り蟌み凊理ずポヌリングの䜿甚の最適化。 ENA ドラむバヌでadaptive-rx モヌドを有効にし、sysctl net.core.busy_read を操䜜するず、パフォヌマンスが 28% 向䞊したした (スルヌプットは 834k req/s から 1.06M req/s に増加し、レむテンシヌは 361ÎŒs から 292ÎŒs に枛少したした)。
  • ネットワヌク スタック内で䞍必芁なブロックを匕き起こすシステム サヌビスを無効にしたす。 dhclient を無効にしお IP アドレスを手動で蚭定するず、パフォヌマンスが 6% 向䞊し、スルヌプットが 1.06M req/s から 1.12M req/s に増加したした。 dhclient がパフォヌマンスに圱響を䞎える理由は、生の゜ケットを䜿甚したトラフィック分析にありたす。
  • スピンロックずの戊い。 sysctl「net.core.default_qdisc=noqueue」および「tc qdisc replace dev eth0 root mq」を介しおネットワヌク スタックを「noqueue」モヌドに切り替えるず、パフォヌマンスが 2% 向䞊し、スルヌプットが 1.12M req/s から 1.15M req/s に増加したした。芁求/秒
  • コマンド「ethtool -K eth0 gro off」を䜿甚しお GRO (Generic Receive Offload) を無効にし、sysctl「net.ipv4.tcp_congestion_control=reno」を䜿甚しおキュヌビック茻茳制埡アルゎリズムを reno に眮き換えるなど、最埌のマむナヌな最適化。 党䜓的な生産性の向䞊は 4% でした。 スルヌプットは 1.15 䞇芁求/秒から 1.2 䞇芁求/秒に増加したした。

この蚘事では、効果があった最適化に加えお、期埅されたパフォヌマンスの向䞊に぀ながらなかった方法に぀いおも説明したす。 たずえば、次のようなこずは効果がないこずが刀明したした。

  • libreactor を個別に実行しおも、コンテナヌ内で実行する堎合ずパフォヌマンスに違いはありたせんでした。 writev を send に眮き換え、epoll_wait の maxevents を増やし、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、skew_tick=1、および Clocksource=tsc を操䜜しおも、パフォヌマンスには圱響したせんでした。
  • 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

    出所 オヌプンネット.ru

コメントを远加したす