サーバーのCPUスケジューラ・クラスと優先度管理についての説明

サーバーCPU スケジューラ・クラスは、どのプロセスがいつ計算時間を受け取るかを制御し、優先順位がどのように変位を引き起こすかを制御する。どのようなクラスがあるのかを紹介する、, 優先順位 とタイムスライスの相互作用と、わずかな設定で負荷分散をコントロールする方法を教えてくれた。.

中心点

  • スケジューラ・クラス ルールに従ってワークロードを整理し、応答時間に影響を与える。.
  • 優先順位 誰が先にCPUの時間を得て、誰が待つかを決める。.
  • 先取り より重要なジョブが保留になっている場合、実行中のタスクを中断させる。.
  • 公平性 個々のプロセスが永続的に支配的になるのを防ぐ。.
  • 測定 エフェクトが目に見えるようになり、より良いセッティングにつながる。.

スケジューラ・クラスがサーバーのパフォーマンスを形成する理由

生産的な環境では、ウェブサーバー、データベース、ジョブが同じものを奪い合う。 CPU, だからこそ、規制された割り当てが重要なのだ。インタラクティブなリクエストがバッチジョブに遅れをとらないように、またユーザーのアクションが迅速なレスポンスを受け取れるように、私は明確なクラスに依存しています。サービスを明確にクラス分けすることで、待ち時間を減らし、タイムアウトを減らし、ピーク負荷時でも動作を予測可能にする。この分類がないと、CPUを大量に消費するプロセスが気づかないうちに 応答時間 を優先する。そのため、私はビジネスクリティカルなパスを優先している。.

基本:優先順位、クラス、タイムスライス

各スケジューラは、以下のものを組み合わせる。 優先順位, クラスとタイムスライスで計算時間を割り当て、変位を制御する。優先度を高くすると待ち時間が短くなるが、高すぎると他のプロセスがロックアウトされ、もたつき感が生じる。タイム・スライスは、あるプロセスが次のプロセスに順番が回ってくるまでに一度に計算する時間を制限し、公平性を促進する。クラスはまた、タスクが優先的に処理されるか、均等に処理されるか、あるいは締め切り規則で処理されるかを定義する。私は、これらのレバーを一緒に評価する。 プランニング をリアルに反映している。.

CFSの詳細:Vruntime、粒度、レイテンシーウィンドウ

リナックスまんせいひろうしょうこうぐん 重要なのは実時間ではなく、仮想ランタイム(稼働時間)である。タスクが受け取ったCPUが多いほど、そのvruntimeは増加し、再スケジューリングされるのが遅くなる。このメカニズムは 公平性, しかし、アクティブなスレッドの数によって、非常に異なるレイテンシが発生する可能性がある。そのため レイテンシーウィンドウ (sched_latency)は、CFSがすべての実行可能タスクに「公平な」時間を割り当てる期間を決定する。多くのタスクに対して、CFSは 最小粒度 その結果、コンテキストの変更が増えるという副作用もある。タスクの数が減れば、クオンタが増え、重いジョブのスループットが向上する。.

私は慎重に調整するだけだ。 最小粒度 は、何千ものアクティブなワーカースレッドによるコンテキストスイッチの嵐を滑らかにします。少し大きめの ウェイクアップ粒度 起床したての短時間タスクが、あまりに頻繁に実行されるスレッドを先取りするのを防ぐ。日中とピーク時の負荷プロファイルで別々に変更をテストしているのは、同じ設定でも夜間の負荷では突然まったく異なる効果を示すからだ。.

Linuxスケジューラ・クラスの簡単な説明

Linuxでは、典型的なサーバータスクは以下のようにクラス分けされている。 ルール CFSは一般的なプロセスに公平に対応し、リアルタイムクラスはハードな反応目標に対応し、DEADLINEはより正確に時間指定を確保する。CFSは一般的なプロセスに公平に対応し、リアルタイムクラスは難しい反応目標に対応し、DEADLINEはより正確に時間指定を確保する。アイドルやバッチのような専門クラスは、フォアグラウンド・サービスを妨げることなくバックグラウンド作業をカバーする。各サービスについて、単にいい値を微調整するのではなく、どのクラスがその通信パターンに対応するかをチェックする。さらに深く掘り下げたい場合は、次のような実用的な洞察を見つけることができる。 CFSと代替医療, 日常的なホスティングで実績のある.

クラス 代表的な使用例 特徴 設定ミスのリスク
cfs (スケジュール_その他) 一般的な サービス内容 満期別の公正シェア クロスカントリースキーが軽作業の仕事を微妙に奪う
リアルタイム(SCHED_FIFO/RR) レイテンシーが重要 タスク 好ましいデザイン CFSプロセスにスターベーションの可能性
締め切り 厳しい時間制限 予算・期間別予約CPU 予算不足が退学者を生む
バッチ/アイドル バックアップ、分析 時間があるときに走る 高負荷時のランタイム向上

Systemd、cgroups、および実装のためのツール

私は優先順位をその場限りではなく、その都度決めている。 単位 そして cgroups ルールが安定するようにする:CPUSchedulingPolicyとCPUSchedulingPriorityはサービスのクラスと優先度を制御し、CPUWeight/CPUQuotaはコアを公平に割り当てる。cgroup v2 では cpu.max そして CPU.weight, ハードフレーム(クォータ/バースト)とソフトウェイトを組み合わせる。これにより、レスポンス・パスを軽快に保ちながら、バックフィルやレポートがブレークアウトすることなく確実にパフォーマンスを受け取ることができる。.

選択補正の場合 ナイス/レニス (CFSの重み付け)、, チャート (リアルタイム/DEADLINE属性)、, タスクセット (CPUとの親和性)と ionice (I/Oの優先順位)。私はこれを手動で再調整する代わりに、スタートスクリプトに組み込んでいる。重要:私は、システム全体に影響を与えないように、例えばログフラッシャーなど、狭い範囲で定義されたサブファンクションだけをリアルタイムに設定し、残りはCFSに残している。 厩舎 が残っている。

賢明に優先順位をつける実践ガイド

まずは控えめに 優先順位 そして、レイテンシ、CPUスティール、コンテキストスイッチを監視しながら、徐々に値を上げていく。フロントエンドのワーカーには少し高い優先度を与えて、リクエストがレポートの後ろで待たされないようにしていますが、データベースのスレッドには余裕を持たせています。バッチタスクはオフピークタイムに移動させるか、バッチ/アイドルクラスに割り当てて、ピークタイムが空くようにしています。反応しにくいターゲットについては、リアルタイム・クラスで明確に区切られた小さなパートが、システム全体を圧迫することなく理にかなっているかどうかをチェックする。このガイドでは、次のような構造化された手順を示している。 優先順位の最適化, には、段階的な変更と測定ポイントが記載されている。.

待ち時間とスループットへの影響

優先順位の高い項目は、以下のようになる。 レイテンシー インタラクティブなリクエストは、バックグラウンドジョブの計算時間を圧迫する。バランスの取れたタイムスライスにより、1つのワーカーがCPUを長時間占有したり、キューが膨れ上がるのを防ぎます。ワークロードによっては、短いクアンタは応答性を向上させ、長いクアンタはストリーミングや圧縮のスループットを向上させます。そのため、レスポンスタイムの95パーセンタイルと99パーセンタイル、リクエストの1秒あたりの処理量の両方を測定しています。これらのメトリクスを使って、優先順位を変えたり、時間をスライスし直したりする必要があるときを認識している。 キャリブレーション.

NUMA、アフィニティ、割り込み制御

マルチソケットのシステムでは、私は次のことを意識的に決めている。 NUMA-所属と CPUとの親和性. .私は、レイテンシが重要なサービスをNUMAノード内のコアにバインドし、そのメモリがローカルに割り当てられるようにしている。こうすることで、追加のレイテンシを伴うリモートアクセスを避けることができます。データベースを多用するホストでは、OLTPスレッドとバックグラウンド・メンテナンス(チェック・ポインタなど)を異なるコア・グループに分離し、レイテンシの短いトランザクションが長期的なタスクとコアを奪い合わないようにしています。.

また 割り込み irqbalanceを働かせるが、必要に応じてホットパスのコアを除外する。ネットワークスタックがボトルネックにならないように、ネットワーク割り込み(RX/TX)を複数のコアに割り当てている。レイテンシに非常に敏感なサービスについては、ノイズの多い割り込みソースを別々のコアにアウトソースしています。この空間的な分離は、プライオリティやクラスを補完するもので、取って代わるものではない。.

モニタリングと測定基準:データによる意思決定

私の価値 指標 ボトルネックを明確に割り当てるために、CPU負荷、ランキューの長さ、コンテキストの切り替え、CPUスティールなどを測定する。スループットの低下とともにランキューが上昇している場合は、優先順位が正しくないか、タイムスライスが狭すぎることを示している。コンテキストスイッチの回数が異常に多い場合は、スレッドの計算が速すぎ、管理自体が時間を食っていることがわかる。負荷が混在している場合は、どのサービスクラスも永久に損をしないように、公平性をチェックする。ガイドラインとトレードオフについての良い紹介は、以下の記事にある。 スケジューリング・ポリシー, 私はそれを判断基準にしている。.

トレース、プロファイリング、再現可能なテスト

チューニングを修正する前に、原因と結果を確認したい。私は プロファイリング そして トレース, を使用して、ホットパス、ロック待ち時間、先取り頻度を可視化します。ウォームアップ・フェーズのある短時間の反復可能な負荷テストは、コールド・キャッシュやウォームアップJITによる誤解を防ぐ。単にピーク値を比較するのではなく、数分間、数回にわたってパーセンタイルを収集する。最初にベースライン、次に変更、次に同一のテストというように、きれいに分けることが重要です。数週間後にまったく同じ環境を再現できるように、ホストとカーネルのパラメーターを中間測定値として文書化します。.

典型的な落とし穴とアンチパターン

上げる 優先順位 なぜなら、これは階層をずらし、新たなボトルネックを生み出すだけだからである。永続的に高いリアルタイム値を設定すると、通常のプロセスが簡単に停止し、予測できない副作用が発生する。小さすぎるタイムスライスはコンテキストの変更を促し、CPUが明らかに動作しているにもかかわらずパフォーマンスが低下する。明確なクラス選択がないまま、CPU負荷の高いタスクとI/O負荷の高いタスクが混在すると、交互に処理されることになり、パフォーマンスを浪費する。システマティックなアプローチは、時間を節約し、逆戻りを防ぎ、パフォーマンスを維持する。 安定性 高い。

SMT、エネルギー状態、ターボ効果

SMT/ハイパースレッディング 論理コアは重複するが、物理実行ユニットは共有する。したがって、SMTの姉妹コアを割り当てる前に、レイテンシが重要なスレッドを別の物理コアにスケジューリングすることを好む。そうしないと、共有コンピューティングロジックが待ち時間を増加させる可能性がある。私はまた、次のことも観察している。 ターボ- そして Cステート深いスリープ状態はエネルギーを節約するが、ウェイクアップ時間がかかる。レイテンシーのあるパスでは、エネルギー・ポリシーが許せば、深いCステートを減らすか、コアを „ウォーム “にしておく。逆に、バッチクラスは意図的に深くスリープさせる。.

作業負荷タイプ別チューニング例

ウェブサーバーには、軽いものを提供している。 優先権-リクエストハンドラの設定を変更し、その直下でキャッシングプロセスを実行する。データベースは、バランスの取れたタイムスライス、十分なアクティブワーカースレッド、ログフラッシャーやチェックポインターのためのみに制限されたリアルタイム使用によって恩恵を受ける。バッチジョブをidle/batchクラスに移動させ、フロントエンドのパスを遅くすることなく空きサイクルを利用する。アナリティクスとETLをインタラクティブなサービスから分離し、別のクラスかCPUクォータを持つコンテナを使うことが多い。こうすることで、追加的なCPU割り当てをすることなく、レイテンシーをコントロールすることができる。 ハードウェア を提供する。.

ロールアウト、ガードレール、リターン・ルート

私はスケジューラのチューニングをリリースのように行っている。 カナリア-ホスト、明確なキャンセル基準、高速ロールバック。私はP99のレイテンシー、エラーレート、CPUスティールの制限値を定義している。もし値がしきい値を超えたら、自動的に最後の安定したコンフィギュレーションに戻す。イテレーションごとの変更は、優先順位のみ、またはタイムスライスのみに制限しています。すべての設定のバージョンを保管し、仮定と測定結果を文書化する。こうすることで、たとえ人やプラットフォームが変わっても、良いコンフィギュレーションへの道筋を追跡することができる。.

仮想化と共有ホスト

私がコントロールする共有ホスト CPU-クオータ、ピン留め、NUMAアフィニティなど、優先順位を調整する前に。仮想マシンは物理コアを共有するため、CPUスティールによって待ち時間の測定値が大きく変わる。私は、クリティカルなサービスの予約をスケジューリングし、そのスレッドが予測可能な計算時間を受け取れるようにしている。個々のクライアントによるエスカレーションを防ぐために、コンテナを制限に縛る。このような基盤が整って初めて、クラスの割り当てを微調整し 優先順位 プロセスごとに。.

日常生活のまとめ

私はまず、意味のあるサービスを割り当てる。 クラス 適度な優先順位を設定し、特にレイテンシー、スループット、ランキューを監視する。小さな一歩が明確な効果をもたらし、大きな飛躍は原因を不明瞭にし、ロールバックを困難にする。レスポンスタイムが重要なところでは、限定的な優先順位付けを許し、スループットが重要なところでは、クアンタを拡張し、優先順位をフラットに保つ。スケジューラーは直感的でない結果を示しやすいからだ。この規律に従って、私は サーバー-CPUを効率的に使用し、レスポンスを高速に保ち、すべてのサービス間で公平性を保つ。.

現在の記事