...

Linuxカーネルの性能:ホスティング性能への影響

どのように Linuxカーネルのパフォーマンス 例えば、現在の6.xリリースでは、5.15と比較して、WAN速度が最大38 %、LAN速度が最大30 %向上しています。私は、HW GRO、BIG TCP、最新のスケジューラなどのカーネルの革新を明確な対策に変換し、サーバーのパフォーマンスを顕著に向上させることができます。 加速する また、負荷がかかっても信頼性が高い。.

中心点

オリエンテーションのために、最も重要な記述を要約し、最初に検討するレバーに印をつけた。.

  • カーネル6.xBIG TCP、GRO、より優れたオフロードにより、ネットワークが大幅に高速化。.
  • CPUスケジューラより細かいスレッドタイミングにより、PHP、Python、データベースの待ち時間を短縮。.
  • リソースNUMA、I/Oスケジューラ、ソケットキューがボトルネックを防ぐ。.
  • チューニングSysctl、IRQアフィニティ、キャッシュは、測定可能な利益をもたらす。.
  • テスト勝利とP95/P99は真の進歩を約束する。.

最初の賭けは ネットワーク, というのも、ここで最大の利益が得られるからだ。そして、スレッドができるだけ待たず、カーネルも待たずに済むように、CPUの割り当てとメモリを整理する。 コンテキストの変更 が作成される。ストレージについては、適切なスケジューラを選択し、キューの深さとファイルシステムのオプションをチェックする。カーネルやコンフィギュレーションを変更したらすぐにロードテストを繰り返し、成功したことを記録する。こうすることで、リグレッションを回避し、すべての調整に一貫性を保つことができる。 ターゲット.

カーネル・バージョンがホスティング・パフォーマンスを左右する理由

カーネルが制御する ハードウェア, プロセスとI/Oルーティング全体は、バージョンによって速度と応答性が直接左右される。古い5.xコアは試行錯誤が繰り返されているが、最新のネットワークカード、CPU、NVMeスタックの利用は少ないことが多い。6.8と6.11では、Receiver HW GROやBIG TCPなどの最適化が導入され、シングルストリームのスループットが著しく向上しました。 リフト. .テストでは、MTUとNICに応じて、WANで最大38 %、LANで最大30 %の向上が確認されています。PHP、Python、Nodeを使用したダイナミックなウェブサイトの場合、リクエストあたりの時間が短縮され、ウェブサーバーのキューの混雑が最小限に抑えられます。.

特に、アプリケーションが多くの小さなレスポンスを送信する場合や、TLSターミネーションが多用される場合にメリットがある。 CPU コストがかかる。新しいスケジューラーは、ワークロードをより細かくコアに分散し、短いタスクのインタラクティブ性を向上させる。同時に、最適化されたネットワークパスにより、パケットあたりのオーバーヘッドが削減されている。その結果、P95とP99のレイテンシーがより安定し、検索エンジンがこれを尊重するようになりました。SLA目標達成で神経とコストを節約 , オーバープロビジョニングが少なくて済むからだ。.

カーネル構成:先取り、ティック、分離

バージョンに加えて プロフィール. .私は6.xシステムでPREEMPT_DYNAMICを使い、スループットとレイテンシのバランスをとっている。本当にレイテンシーが重要なタスク(TLSプロキシやAPIゲートウェイなど)には 予定 一方 PREEMPT_NONE は大規模なバッチジョブを高速化する。また NO_HZ_FULL そして、選択したワーカーのみが実行するコアを個別に分離する(isolcpus、rcu_nocbs)。こうすることで、スケジューラのティックやRCUコールバックからの干渉を減らしている。この分離を IRQアフィニティ, NICの割り込みと関連するワーカーがCPUの近くにとどまるように。.

割り込みの負荷が高いシステムでは、NAPIバジェットの値を適度に上げて、次のようなことが起こるかどうか観察している。 ksoftirqd コアを占有する。スレッドが恒常的に時間を食い過ぎる場合は、RPS/XPS経由でキューを分散させ、IRQ合体を調整する。目的は、アプリケーション・スレッドがCPU時間を奪い合わないように、softirqを制御下に保つことだ。.

パフォーマンス比較:新旧カーネル・バージョン

最も重要な違いをコンパクトにまとめた。 テーブル とアプリケーションの推奨を補足する。この情報は、ラージストリームとデータセンターリンクをマッピングした1500Bと9K MTUでの測定に基づいています。これは、各ホスト・プロファイルに適したバージョンを選択するのに役立ちます。また、NICドライバがGRO、TSO、RFSなどの機能を完全にサポートしているかどうかにも注意しています。このサポートがないと、カーネルの改良がドライバのオーバーヘッドで消えてしまうことがあり、貴重な時間を浪費することになる。 サイクル 食べる。.

カーネルバージョン WAN改善 LAN改善 特集 こんな人に向いている
5.15 ベースライン ベースライン 実績のあるドライバー レガシーホスティング
6.8 +38 % +30 % hw gro, big tcp 交通量が多い
6.11 +33-60 % +5-160 % レシーバーの最適化 ネットワーク・インテンシブ

BIG TCPを使用する人は、最大TCPサーバー数をチェックする。 SKB_FRAGS とMTUを変更し、カードが大きなセグメントを効率的に処理できるようにした。AMDホストでは、シングルストリームが40Gbpsから53Gbpsに増加し、インテルではパケットサイズによってさらに増加した。私はここで盲目的になることを避け、同じ構成のNIC、同じMTU、同じTLSセットアップでテストする。そうして初めて、ワークロードごとの実際の利得を評価することになる。こうして、実際に自分のホスト・プロファイルに最も適したバージョンを選んでいる。 サーブ.

CPUスケジューリングとNUMA:負荷時の実際の効果

CPUの割り当ては、スレッドがスムーズに動くかどうかを左右する。 走る あるいは常に待たされる。最新の6.xコアは、短いタスクをより優先させ、ウェブサーバーやプロキシの待ち時間のピークを減らします。複数のCPUソケットを持つホストではNUMAバランシングが重要で、そうしないとメモリアクセスが他のノードで頻繁に終わってしまいます。IRQと重要なワーカーを適切なコアに固定することで、キャッシュの局所性を保持します。より詳細な紹介については、コンパクトな NUMAの記事, これにより、CPU、RAM、ワークロードのマッピングが容易になった。.

高地下 負荷 cgroups v2を使用して、うるさい隣人を捕まえ、公平なCPU時間を保証する価値がある。また、irqbalance設定をチェックし、必要であればアフィニティーを手動で設定する。スケジューラが長いトランザクションと短いウェブリクエストを競合させないようにすれば、データベースは恩恵を受ける。私はコンテキストスイッチの回数に注意し、スレッドプーリングとワーカー数の削減によって、その回数を減らしている。このような対策により、ハードウェアを導入することなくP95のレイテンシを安定させることができる。 トップアップ.

パワーマネージメント:ターボ、Cステート、ガバナー

パフォーマンスと 省電力モード はレイテンシーに強く影響する。私は通常、レイテンシー・パスの「パフォーマンス」ガバナーを選択するか、intel_pstate/amd-pstateに積極的な「パフォーマンス」を設定する。 エネルギー性能優先. .低いCステートは消費を抑えるが、ウェイクアップのジッターを引き起こす。私はフロントエンド・ワーカーのCステートを制限しているが、バッチ・ジョブはもっと節約しても構わない。この選択を測定することは重要である。P95の値が良ければ、消費電力が多少高くても正当化されることが多い。.

ターボ・ブーストは選択的に使うが、温度と電力制限に注意している。スロットリングが有効になると、負荷のピーク時にクロックレートが正確に下がります。私は冷却と電力制限を調整して、ホストが私のアプリケーションに有益なブースト時間を持つようにしています。.

ネットワーク・スタック:BIG TCP、GRO、輻輳制御

ネットワークは、目に見える形で最大のレバレッジを発揮する。 より速く ページ。BIG TCPはセグメントサイズを大きくし、GROはパケットを束ねて割り込みオーバーヘッドを減らす。RFS/XPSは、キャッシュヒットを増やすために、フローをコアに分散させる。広域トラフィックのシナリオでは、輻輳制御を意識的に決定する。この違いを理解したければ、以下の概要に詳細がある。 TCP輻輳制御, これはレイテンシー効果をよく要約している。.

私は一貫性を保つことから始める sysctl-値:net.core.rmem_max、net.core.wmem_max、net.core.netdev_max_backlog、tcp_rmem/tcp_wmem。その後、同じMTUと同じTLS暗号セットでテストし、アップルのものとアップルのものを比較する。マルチポート・カードでは、RSSとキューの数をチェックして、すべてのコアが動作していることを確認する。TSO/GSOのようなオフロードがドロップにつながる場合は、各インターフェースごとにオフロードを解除します。きれいな測定カーブを確認できた場合にのみ、他のインターフェイスにコンフィギュレーションを展開します。 ホスト より。

IRQ Coalescing、Softirqs、ドライバの詳細

適度な IRQ合体 私はレイテンシーを滑らかにし、割り込みストームを減らしている。控えめに始めて、ドロップが減るまでマイクロ秒とパケットのしきい値を徐々に増やしていくが、P95は苦にならない。非常に小さなパケット(例えばgRPC/HTTP/2)では、合体しすぎると遅くなるので、応答時間を優先します。私は ソフティアーク-時間、パケット・ドロップ ネットデブ-バックログksoftirqdが恒久的にCPUを食ってしまう場合、RSSキュー、RPS/XPS、合体などのバランスが適切でないことが多い。その後、XPSを使って、関連するワーカーも運ぶコアにフローをより正確に分配する。.

私は、NICごとにTSO/GSO/GROやチェックサム・オフロードなどのドライバ機能をチェックしています。HW-GROで大きな利益をもたらすカードもあれば、ソフトウェア・パスからより多くの利益を得るカードもあります。重要 エムティーユー はパス全体で一貫している。サーバーのMTUが大きくても、スイッチやピアがそれを短くすれば、ほとんど意味がない。.

ストレージとI/Oパス:スケジューラーからファイルシステムまで

多くのページは 入出力, ネットワークではありません。NVMeは適切なI/Oスケジューラを必要とし、そうでなければホストはスループットを手放し、レイテンシのピークを増加させる。HDD/ハイブリッド・セットアップの場合、BFQがより優れたインタラクティブ性を提供することが多く、mq-deadlineはNVMeでより安定した時間を提供します。私は、キューの深さ、readahead、noatimeやバリア設定などのファイルシステムのオプションをテストしています。背景情報をお探しでしたら、以下のコンパクトなガイドをご覧ください。 I/Oスケジューラ, これは、効果を実用的な方法で分類したものである。.

バックアップとクーロンジョブをサイレントに移す 時間枠, 本番の負荷がぶつからないようにね。また、可能であればデータベースのログを自分のデバイスに隔離する。ext4とXFSについては、マウントオプションをテストし、ジャーナルモードをチェックします。iostat、blkstat、perfを使って、ホットスポットを素早く認識します。その結果、カーネルのブロックが減り、アプリケーションが継続的に実行されるため、応答時間が短縮されます。 事業所.

io_uring、ゼロコピー、ライトバック制御

私は最新のコアを使用している io_uring 非同期I/Oワークロード向け。システムコールがバンドルされ、コンテキストスイッチが削減されるため、ウェブサーバー、プロキシ、データパイプラインが恩恵を受ける。大きなファイルを送信するときは、TLSストラテジーやオフロードと相互作用するやいなや、ゼロコピーパス(sendfile/spliceまたはSO_ZEROCOPY)を使用する。CPU負荷が減少するかどうか、また高い同時実行性でレイテンシが安定しているかどうかを測定している。.

vm.dirty_*パラメーターでライトバックとページキャッシュを制御している。大きすぎるダーティキューは、バーストフェーズを高速化し、フラッシュを遅らせます。一方、小さすぎる値は、頻繁な同期を生成し、物事を遅くします。私のSSD/RAID構成に対応するウィンドウをサウンドアウトし、集中的な書き込みフェーズ中のP95レイテンシをチェックする。.

サーバーのチューニング:特定のカーネル・パラメーター

アップグレード後、私はいくつかの、しかし効果的な調整を行った。 スイッチ. .ネットワークでは、net.core.somaxconn、tcp_fastopen、tcp_timestamps、net.ipv4.ip_local_port_rangeから始める。多くの接続では、より高いnet.core.somaxconnとウェブサーバーの適切なバックログキューが役立ちます。メモリでは、適度なvm.swappinessが不適切な立ち退きを減らし、hugepagesはアプリケーションごとに明確なテストが必要です。htop、psrecord、perf、eBPFツールを使えば、顧客よりも先にボトルネックがわかります。 覚える.

測定にはCPU、メモリー、I/Oのsysbenchを使用し、5.15と6.xを比較した。 構成. .Apache BenchとSiegeは高速チェックを提供する: ab -n 100 -c 10, siege -c50 -b。同じTLSハンドシェイク、同じペイロード、同じキャッシュ・ステータスなど、再現可能な条件が重要だ。ブレークポイントを見つけるまで、テスト時間と同時実行数を徐々に増やしていく。そして、すべての変更を文書化し、ロールバック・パスを作成することで、利益を確保する。 用意をする.

TLS、暗号オフロード、kTLS

CPU時間の大部分は ティーエルエス. .CPUがAES-NI/ARMv8暗号をサポートしているかどうか、OpenSSLプロバイダーがそれを使っているかどうかをチェックする。kTLSはカーネル・パスのコピーのオーバーヘッドを削減する。私のウェブ・サーバー/プロキシがこの恩恵を受けているかどうか、ゼロ・コピーがTLSで確実に機能するかどうかをテストする。重要:ベンチマークが比較できるように、暗号セットは一貫性を保つこと。.

観測可能性:eBPF/Perf-日常使用における最小値

私は小規模で再現性のある仕事をしている。 測定セットCPUプロファイリング用のperf stat/record、, ティーシーピー- そして バイオレイテンシー-eBPFツールによるネットワーク/ストレージの分散、ランキューの長さのヒートマップなどだ。これにより、ソフト・エラー、システムコール、ロック、メモリー・アクセスのどれが支配的かを素早く見つけることができる。ボトルネックを解消したら、副作用を認識するために同じセットを繰り返す。CPU、NET、IOのカーブがきれいになって初めて、構成をスケールアウトする。.

負荷テストを正しく評価する

平均値をチェックするだけでなく、何よりも P95 とP99。これらの主要な数値は、ユーザーが顕著な待ち時間を経験する頻度を示している。エラー率の増加は、スレッドまたはソケットの枯渇を示す。ロードアベレージでは、純粋なCPUパーセンテージではなく、キューを表していることに注意してください。また、Aioやデータベースの待ち時間も値を上昇させます。 トップ.

現実的なテストでは、本番と同じキャッシュ戦略を使う。コールドスタートし、ウォームで測定し、より長いフェーズを記録する。RPSだけでは不十分で、レイテンシーやリソース状態とリンクさせる。全体像だけが、カーネルとチューニング・パラメーターがどれだけうまく連動しているかを示している。このようにして、私は、改善が合成ベンチマークにおいてのみ認識されるのではないことを保証します。 輝く.

仮想化:時間とオーバーヘッドを盗む

共有ホストでの速度低下 盗む 時間は静かにパフォーマンスのスイッチを切る。私はvCPUあたりの値を監視し、サービスの同時実行を計画します。ステイルタイムが高ければ、専用インスタンスに切り替えるか、ゲストの優先度を上げる。ハイパーバイザーでは、vCPUを一貫してNUMAノードに分配し、重要なNICのIRQを固定します。やみくもにコンテナを減らすのではなく、カーネルがCFSの決定をきれいに行えるように制限を最適化します。 会う 缶。

virtio-netのような仮想NICは、より現代的なメリットを享受できる。 ドライバー そして十分なキューがある。また、vhost-netがアクティブかどうか、MTUが一貫して正しいかどうかもチェックする。ストレージ側では、paravirtオプションとキューの深さをチェックします。密度が高い場合は、監視の頻度を上げて、スパイクに早く気づくようにしています。こうすることで、優れたカーネル機能が仮想化のオーバーヘッドで失われるのを防いでいる。 砂を上げる.

コンテナのワークロードCgroup v2を正しく使用する

マイクロサービスには cgroup v2-コントローラ:cpu.max/cpu.weightは公平性を制御し、memory.highは退避の嵐からホストを守り、io.maxは干渉する書き込みを制限する。cpuset.cpusとcpuset.memsで、レイテンシ・パスをNUMAに近づけている。各サービスクラス(ウェブ、DB、キャッシュ)の制限を文書化し、ヘッドルームを空けておくことで、あるサービスが短期間により多くを必要とした場合にカスケード効果が発生しないようにしている。.

ディストリビューションの選択:カーネル・ケイデンスとサポート

分布は、どの程度のスピードで カーネル-アップデートが利用可能になるまでの期間と、修正が届くまでの期間です。DebianとRocky/Almaは、長期間メンテナンスされたパッケージを提供しており、変更が予測できる静かなセットアップに理想的です。Ubuntu HWEはより若いカーネルを提供し、ドライバや機能をより早く使えるようにする。Gentooは、命令セットまで細かくチューニングできるので、特殊なホストに有利です。私は、ワークロードプロファイル、アップデートウィンドウ、そして自分のマシンの要件に応じて、Ubuntu HWEとGentoo HWEを使い分けることにしている。 お客様.

慎重なアップグレードは、同一のハードウェアを持つステージング・ホストから始めます。パッケージソース、セキュアブート、ZFSや特殊なNICドライバなどのDKMSモジュールをチェックします。そして、予期せぬジャンプを避けるために、カーネルのバージョンを固定します。生産性の高いシステムについては、メンテナンス・ウィンドウを計画し、ロールバックを明確にします。こうして、新機能と高信頼性を組み合わせている。 計画性.

スピードを損なうことなく安全性とメンテナンス性を確保

セキュリティ・パッチが適用されない場合がある パフォーマンス しかし、その影響は長続きしない。私は、利用可能な場合にはライブパッチを使用し、spectre_v2やretpolineのような緩和策の影響をテストしています。特定のコンテキストにおいて付加価値をもたらさない機能を選択的に無効にすると、ホストによっては顕著な効果が得られます。とはいえ、セキュリティは依然として義務であり、そのために私は意識的に決断を下し、例外を文書化するのです。どのホストのプロフィールにも、リスクとセキュリティの明確な線引きが必要です。 スピード.

リグレッションテストを行いながら、定期的なカーネルアップデートを完了させている。アップデート前後のperfプロファイルを保存し、ホットスポットを比較する。異常値が出た場合は、ロールバックするか、同じシリーズの代替マイナーバージョンを使う。負荷がかかったときにボトルネックにならないように、ログは無駄なく取っています。これにより、可用性、セキュリティ、パフォーマンスをクリーンな状態に保つことができる。 バランス.

簡単な要約と行動計画

現在の6.xカーネルを持ち上げる ネットワーク 私の最初のステップは、BIG TCP、GRO、RFS/XPSとクリーンなsysctl値です。その後、IRQアフィニティとNUMAマッピングを使ってCPUの近接性を確保し、ストレージ用に適切なI/Oスケジューラを選択する。ab、Siege、sysbenchの助けを借りて、RPSとP95/P99を比較して利益をチェックする。カーブがきれいであれば、コンフィギュレーションとカーネルバージョンを制御された方法でロールアウトします。これにより、レイテンシを減らし、スループットを向上させ、応答時間を3秒以下に保つことができる。 .

1) 6.8+または6.11と適切なドライバにアップグレードする。2) ネットワークスタックを調整し、適切な輻輳制御を選択する。3) CPU/NUMAとIRQを整理し、ストレージキューとファイルシステムのオプションをテストする。4) パラメータ、バージョン、ドキュメントを変更して負荷テストを繰り返す。この方法で進める人は、以下を使用する。 リナックス カーネルは一貫して革新的で、既存のハードウェアから驚くほど多くを引き出す。.

現在の記事