すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:グループID機能

最終更新日:Dec 11, 2024

カーネルバージョン4.19.91-24.al7以降のAlibaba Cloud Linux 2とカーネルバージョン5.10.46-7.al8以降のAlibaba Cloud Linux 3は、グループID機能をサポートしています。 グループID機能を使用して、CPUコントロールグループ (cgroups) に異なるIDを設定し、cgroups内のプロセス (タスク) の優先順位を定義できます。

背景情報

レイテンシに敏感なタスクとコンピューティングタスクを同じインスタンスにデプロイする場合、Linuxカーネルスケジューラは、スケジューリングのレイテンシとカーネルスケジューリングに対する低優先度のタスクの影響を最小限に抑えるために、優先度の高いタスクにより多くのスケジューリング機会を提供する必要があります。 上記のシナリオでは、Alibaba Cloud LinuxがグループID機能を提供し、CPU cgroupsのスケジューリング優先順位を設定するために使用できるインターフェイスを追加します。 優先度が異なるタスクには、次の特徴があります。

  • 優先度の高いタスクのウェイクアップ遅延は最小限です。

  • 優先度の低いタスクは、優先度の高いタスクのパフォーマンスには影響しません。

    • 優先度の低いタスクをウェイクアップしても、優先度の高いタスクのパフォーマンスには影響しません。

    • 低優先度タスクはハードウェアユニットを共有せず、高優先度タスクのパフォーマンスに悪影響を与えません。

前提条件

説明
  • カーネルバージョン4.19.91-264.19.91-26.14.19.91-26.2、または4.19.91-26.3のAlibaba Cloud Linux 2では、カーネルでグループID機能が無効になっています。 uname -rコマンドを実行して、Alibaba Cloud Linux 2のカーネルバージョンを照会できます。

  • カーネルバージョン5.10.112-11.al85.10.112-11.1.al85.10.112-11.2.al85.10.134-12.al85.10.134-12.1.al8、または5.10.134-12.2.al8のAlibaba Cloud Linux 3では、カーネルでグループID機能が無効になっています。

  • 4.19.91-25.1.al7から4.19.91-25.5.al7の範囲のカーネルバージョンでAlibaba Cloud Linux 2のグループID機能を使用すると、ダウンタイムが発生します。 この場合、カーネルのバージョンを4.19.91-25.6.al7以降にアップグレードしてください。 詳細については、「カーネルバージョンの変更」トピックの「カーネルのアップグレード」をご参照ください。

  • Alibaba Cloud Linux 3とカーネルバージョン5.10.134-12.2.al8がx86_64アーキテクチャを使用している場合、次のコマンドを実行してグループID機能を有効にします。

    yum makecache
    sudo yum install scheduler-group-identity.x86_64 -y
  • カーネルバージョン4.19.91-26.4以降のAlibaba Cloud Linux 2およびカーネルバージョン5.10.134-13.al8以降のAlibaba Cloud Linux 3では、/proc/sys/kernel/sched_group_identity_enabledインターフェイスが追加され、グループID機能を有効にできます。 グループID機能を使用する前に、sudo sh -c 'echo 1 > /proc/sys/kernel/sched_group_identity_enabled 'コマンドを実行して機能を有効にする必要があります。

グループID機能の仕組み

グループID機能を使用すると、CPU cgroupsのIDを設定して、cgroups内のタスクの優先順位を定義できます。 グループID機能は、デュアル赤黒ツリーアーキテクチャに依存しています。 完全公正スケジューラ (CFS) スケジューリングキューの赤黒ツリーに基づく低優先度の赤黒ツリーが追加され、低優先度のタスクが格納されます。

カーネルがIDが構成されているタスクをスケジュールすると、カーネルはタスクの優先度に基づいてタスクを処理します。 次の表に、優先度の高い順にIDを示します。

ID

説明

ID_HIGHCLASS

優先度の高いタスクを識別します。 高優先度タスクは、通常または低優先度タスクよりもリソースを先取りする機会が多い。

CFSが優先度の高いタスクをスケジュールする場合、次のシナリオが発生する可能性があります。

  • 低優先度のタスクが実行されているときに高優先度のタスクが起動した場合、高優先度のタスクは、低優先度のタスクからリソースを無条件に先取りすることができる。

  • 通常優先度のタスクが実行されているときに高優先度のタスクが起動し、高優先度のタスクの仮想ランタイム (vruntime) が通常優先度のタスクのvruntimeよりも短い場合、高優先度のタスクは元のスケジューリングポリシーを無視し、リソースを先取りできます。 元のスケジューリングポリシーでは、CPU上のタスクのランタイムが最小ランタイムよりも短い場合、タスクがリソースをプリエンプトできないことを指定しています。

  • タスクが実行待ち行列になっているときに優先度の低いタスクまたは通常のタスクが実行されている場合、実行中のタスクのvruntimeがvruntimeよりも短い優先度の高いタスクは、元のスケジューリングポリシーを無視してリソースをプリエンプトできます。 元のスケジューリングポリシーでは、CPU上のタスクのランタイムが最小ランタイムよりも短い場合、タスクがリソースをプリエンプトできないことを指定しています。

ID_NORMAL

通常優先度のタスクを識別します。 通常優先度のタスクは、低優先度のタスクよりもリソースを先取りする機会が多い。

CFSが通常優先度のタスクをスケジュールする場合、次のシナリオが発生する可能性があります。

  • 低優先度タスクが実行されているときに通常優先度タスクが起動した場合、通常優先度タスクは、低優先度タスクからリソースを無条件に先取りすることができる。

  • タスクが実行待ち行列になっているときに優先度の低いタスクが実行されている場合、vruntimeが実行中のタスクのvruntimeよりも短い通常優先度のタスクは、元のスケジューリングポリシーを無視してリソースをプリエンプトできます。 元のスケジューリングポリシーでは、CPU上のタスクのランタイムが最小ランタイムよりも短い場合、タスクがリソースをプリエンプトできないことを指定しています。

ID_UNDERCLASS

優先度の低いタスクを識別します。

CFSが低優先度のタスクをスケジュールする場合、次のシナリオが発生する可能性があります。

ID_SMT_EXPELLERタスクがピア同時マルチスレッド (SMT) CPUで実行される場合、優先度の低いタスクが現在のCPUから追い出されます。

上記のIDは、CPU cgroupsのリソース管理ポリシーに基づいて適用されます。

  • 同じレベルのCPU cgroupsのタスクの場合、IDの優先順位が有効になります。

  • 異なるレベルのCPU cgroups内のタスクの場合、IDの優先度は親cgroups内のタスクでは有効になりませんが、子cgroups内のタスクでは有効になります。

  • 同一のID優先順位を有するタスクの場合、リソースは、CFSポリシーに準拠して競合される。 ID_UNDELCLASSまたはID_NORMAL IDで識別されるタスクのランタイムが最小値に達しない場合があることに注意してください。

その他のID

ID

説明

ID_SMT_EXPELLER

SMTエクスペラータスクを識別します。 SMTエクスペラータスクがSMT CPUを実行すると、タスクはID_UNDELCLASS IDによって識別されるタスクをピアCPUから削除します。

ID_IDLE_シーカー

タスクが起動したときに、タスクがスケジューラーポリシーの制限内でアイドル状態のCPUを検索しようとすることを指定します。

ID_IDLE_SAVER

sched_idle_saver_wmarkカーネルパラメーターと共に使用されます。 sched_idle_saver_wmarkを使用して、CPUアイドル時間の透かしを設定できます。 ID_IDLE_SAVER IDによって識別されるタスクが起動すると、タスクは、アイドル時間が指定されたウォーターマークを超えるCPUを見つけようとします。

インターフェイス

  • IDの設定に使用するインターフェイス

    グループID機能は、タスクIDを設定できるように、次のインターフェイスを提供します。/sys/fs/cgroup/cpu/$cg/cpu.identityおよび /sys/fs/cgroup/cpu/$cg/cpu.bvt_warp_ns$cg変数は、タスクが実行される子cgroupディレクトリノードを指定します。 インターフェイスを使用する前に、次の項目に注意してください。

    • cpu.bvt_warp_nsインターフェイスはクイック設定インターフェイスです。 インターフェースの書き込まれた値は、ID値に変換される。

    • cpu.identityおよびcpu.bvt_warp_nsインターフェイスを使用して、cgroupsのIDを変更できます。

    • cpu.identityインターフェイスを使用して書き込まれたidentity値は、cpu.bvt_warp_nsインターフェイスを使用して以前に書き込まれたidentity値を上書きしますが、cpu.bvt_warp_nsインターフェイスの値は変更されません。

    • cpu.bvt_warp_nsインターフェイスを使用して記述されたID値は、以前にcpu.identityインターフェイスを使用して記述されたID値を上書きしますが、cpu.identityインターフェイスの値は変更されません。

    • いずれかのインターフェイスを使用して、タスクIDを設定できます。 インターフェイスを同時に使用しないことをお勧めします。

    • オペレーティングシステムのカーネルに関連する操作に慣れていない場合は、cpu.identityインターフェイスを使用しないことをお勧めします。

    次の表に、インターフェイスを示します。

    インターフェイス

    説明

    cpu.identity

    デフォルト値は0で、ID_NORMAL IDを指定します。

    インタフェースは5ビットフィールドである。 各ビットの有効値: 0と1。 値0は、アイデンティティが仮定されないことを指定する。 1の値は、アイデンティティが仮定されることを指定する。 各ビットの説明:

    • インターフェイスが空のままの場合、ID_NORMAL IDが使用されます。

    • ビット0: ID_UNDELCLASSアイデンティティを指定する。

    • ビット1: ID_HIGHCLASSアイデンティティを指定する。

    • ビット2: ID_SMT_EXPELLERアイデンティティを指定する。

    • ビット3: ID_IDLE_SAVERアイデンティティを指定する。

    • ビット4: ID_IDLE_SEEKERアイデンティティを指定する。

    たとえば、cgroupのIDをID_HIGHCLASSID_IDLE_SEEKERに設定する場合、ビット1とビット4を1に設定し、その他のビットを0に設定して、10010のバイナリ値を取得します。 次に、echo 18 > /sys/fs/cgroup/cpu/$cg/cpu.identityコマンドを実行して、cpu.identityインターフェイスに18を書き込みます。

    cpu.bvt_warp_ns

    デフォルト値は0で、ID_NORMAL IDを指定します。 有効な値:

    • 2: ID_SMT_EXPELLERID_IDLE_SEEKER、およびID_HIGHCLASS IDを指定します。 cpu.identityインターフェイスの対応する値は22です。

    • 1: ID_HIGHCLASSおよびID_IDLE_SEEKER IDを指定します。 cpu.identityインターフェイスの対応する値は18です。

    • 0: ID_NORMAL IDを指定します。 cpu.identityインターフェイスの対応する値は0です。

    • -1: ID_UNDELCLASSおよびID_IDLE_SAVER IDを指定します。 cpu.identityインターフェイスの対応する値は9です。

    • -2: ID_UNDELCLASSおよびID_IDLE_SAVER IDを指定します。 cpu.identityインターフェイスの対応する値は9です。

    説明

    デフォルトでは、Alibaba Cloud Linuxはcgroup v1インターフェイスをサポートしています。 5.10カーネルシリーズのカーネルバージョン5.10.134-13以降のAlibaba Cloud Linux 3は、グループID機能用に次のcgroup v2インターフェイスもサポートしています。

    /sys/fs/cgroup/$cg/cpu.identityおよび /sys/fs/cgroup/$cg/cpu.bvt_warp_nsです。 $cg変数は、タスクが実行される子cgroupディレクトリノードを指定します。

  • カーネルスケジューリング機能の有効化または無効化に使用するインターフェイス

    次のコマンドを実行すると、sched_featuresインターフェイスを使用してカーネルスケジューリング機能のデフォルト設定を表示できます。

    sudo cat /sys/kernel/debug/sched_features

    次の表に、カーネルのスケジューリング機能を示します。

    カーネルスケジューリング機能

    説明

    デフォルト値

    ID_IDLE_AVG

    この機能は、ID_IDLE_SAVER IDと一緒に使用され、アイドル時間に向けてID_UNDELCLASSタスクのランタイムをカウントします。 これにより、ID_UNDELCLASSタスクのみが実行されているときにCPUがアイドル状態のままにならず、リソースの浪費を防ぎます。

    ID_IDLE_AVG: この機能が有効になっていることを示します。

    ID_RESCUE_EXPELLEE

    この機能は、負荷分散シナリオで使用されます。 タスクが使用可能なCPUリソースを見つけることができない場合、ID_UNDELCLASSタスクを追い出しているCPUを使用して負荷を分散します。 この機能は、ID_UNDELCLASSタスクをできるだけ早く追い出した状態から移動するのに役立ちます。

    ID_RESCUE_EXPELLEE: この機能が有効になっていることを示します。

    ID_EXPELLEE_NEVER_HOT

    この機能が有効になった後、別のCPUに追い出されているタスクを移行する要求が開始された場合、ホットキャッシュによって移行要求が拒否されることはありません。 この機能は、ID_UNDELCLASSタスクをできるだけ早く追い出した状態から移動するのに役立ちます。

    NO_ID_EXPELLEE_NEVER_HOT: この機能が無効になっていることを示します。

    ID_LOOSE_EXPEL

    この機能を有効にすると、CPUがタスクを選択するたびに削除ステータスが更新されるのではなく、sched_expel_update_intervalカーネルパラメーターで指定された時間に基づいてステータスが自動的に更新されます。 この機能の設定は、CPUがタスクを選択したときのステータス更新にのみ影響します。 プロセッサ間割り込み (IPI) の更新は影響を受けません。

    NO_ID_LOOSE_EXPEL: この機能が無効になっていることを示します。

    ID_LAST_HIGHCLASS_STAY

    この機能を有効にすると、CPUで実行された最後のID_HIGHCLASSタスクを別のCPUに移行できなくなります。

    ID_LAST_HIGHCLASS_STAY: この機能が有効になっていることを示します。

    ID_EXPELLER_SHARE_コア

    • この機能を有効にすると、ID_SMT_EXPELLERタスクは、ID_SMT_EXPELLERタスクが既に実行されている物理コアで優先的に実行できます。

    • この機能を無効にすると、ID_SMT_EXPELLERタスクが物理コアに分散されます。 このように、ID_SMT_EXPELLERタスクは互いに干渉しません。

    ID_EXPELLER_SHARE_CORE: この機能が有効になっていることを示します。

    ID_ABSOLUTE_EXPEL

    Alibaba Cloud Linux 3では、この機能はカーネルバージョン5.10.134-16.3で導入され、5.10カーネルシリーズのカーネルバージョン5.10.134-16.3以降で使用できます。 この機能を有効にすると、ID_NORMALまたはID_HIGHCLASSタスクが実行用のタスクキューに存在する場合、ID_UNDELCLASSタスクは完全に抑制され、スケジュールできません。 最悪のシナリオでは、ID_UNDELCLASSタスクが不足します。 ハイブリッド展開シナリオでは、機能を有効にする前に、異なるIDを持つタスクの負荷を評価します。

    NO_ID_ABSOLUTE_EXPEL: この機能が無効になっていることを示します。

    ID_LOAD_バランス

    Alibaba Cloud Linux 3では、この機能はカーネルバージョン5.10.134-16.3で導入され、5.10カーネルシリーズのカーネルバージョン5.10.134-16.3以降で使用できます。 この機能を有効にすると、スケジューラはID_UNDELCLASSタスクのみが実行されているCPUをアイドル状態と見なし、スケジューラが負荷を分散するときにID_HIGHCLASSタスクをアイドル状態のCPUに移行しようとします。 移行中、スケジューラはID_HIGHCLASSタスクをCPUに分散しようとします。 これにより、ID_HIGHCLASSタスク間のCPUリソースの競合とハイパースレッディング (HT) 推論が防止され、各ID_HIGHCLASSタスクが十分なCPUリソースを取得できるようになります。

    NO_ID_LOAD_BALANCE: この機能が無効になっていることを示します。

  • sysctlがカーネルパラメーターを設定するために使用するインターフェイス

    グループ識別機能の特定の機能は、カーネルパラメータの値に依存する。 カーネルパラメーターを次の表に示します。

    カーネルパラメーター

    説明

    単位

    デフォルト値

    /proc/sys/kernel/sched_expel_update_interval

    CPUがタスクを選択したときに削除ステータスが自動的に更新される間隔。 このカーネルパラメーターは、ID_LOOSE_EXPEL機能が有効になっている場合にのみ有効になります。

    ミリ秒

    10

    /proc/sys/kernel/sched_expel_idle_balance_delay

    CPUがタスクを追い出しているときの最小アイドルバランス間隔。 -1の値は、アイドルバランスが許可されないことを指定します。

    ID_UNDELCLASSタスクのみがCPUに存在し、タスクが追い出されている場合、CPUはアイドル状態になります。 負荷分散効果を改善するために、CPU上でアイドルバランスが実行される。 ただし、ID_UNDELCLASSタスクが破損する可能性があります。 この問題を軽減するには、sched_expel_idle_balance_delayパラメーターを指定します。

    ミリ秒

    -1

    /proc/sys/kernel/sched_idle_saver_wmark

    CPUアイドル時間の透かし。 ID_IDLE_SAVERタスクが起動すると、タスクは、アイドル時間が指定されたウォーターマークを超えるアイドルCPUを見つけようとします。

    ns

    0

    /proc/sys/kernel/sched_group_identity_enabled

    カーネルバージョン4.19.91-26.4以降、/proc/sys/kernel/sched_group_identity_enabledインターフェイスが追加され、グループID機能を有効にできます。 グループID機能を使用する前に、echo 1 > /proc/sys/kernel/sched_group_identity_enabledコマンドを実行して機能を有効にする必要があります。

    グループID機能を有効にすると、cgroupのcpu.bvt_warp_nsまたはcpu.identityインターフェイスの値がゼロでない場合、/proc/sys/kernel/sched_group_identity_enabledインターフェイスにデータを書き込むことはできません。

    説明

    カーネルのバージョンが4.19.91-26.4.al74.19.91-26.5.al7、または4.19.91-26.6.al7の場合、sched_group_identity_enabledインターフェイスが1に設定され、cgroupのcpu.bvt_warp_nsインターフェイスの値がゼロでない場合、/proc/sys ///sched_group_idity_settings___ を読み取るとエラーが発生します。 これは、インターフェイスの通常の使用には影響しない読み取りバグです。 このバグは、カーネルバージョン4.19.91-27.al7以降で修正されています。

    非該当

    0

情報出力

グループID機能を使用すると、次のコマンドを実行してさまざまなパラメーターを表示できます。

cat /proc/sched_debug

出力パラメーターを次の表に示します。

パラメーター

説明

nr_high_running

現在のCPUで実行されているID_HIGHCLASSタスクの数。

nr_under_running

現在のCPUで実行されているID_UNDELCLASSタスクの数。

nr_exist_immune

現在のCPUで実行されている非ID_UNDELCLASSタスクの数。

smt_expeller

ID_SMT_EXPELLERタスクが現在のCPUで実行されているかどうかを示します。 値1は、ID_SMT_EXPELLERタスクが現在のCPUで実行されていることを示します。 値0は、現在のCPUでID_SMT_EXPELLERタスクが実行されていないことを示します。

on_exist

ID_SMT_EXPELLERタスクがピアSMT CPUで実行されているかどうかを示します。 値1は、ID_SMT_EXPELLERタスクがピアSMT CPUで実行されていることを示します。 値0は、ピアSMT CPUでID_SMT_EXPELLERタスクが実行されていないことを示します。

high_exec_sum

現在のCPUでのID_HIGHCLASSタスクの累積ランタイム。

under_exec_sum

現在のCPUでのID_UNDELCLASSタスクの累積ランタイム。

h_nr_exist_immune

cfs_rqで実行されている非ID_UNDELCLASSタスクの数。

exists_start

CPUがタスクの削除を開始したときの2つの赤黒ツリーの最小vruntimesの違い。

exists_spread

CPUの削除ステータスによって発生した2つの赤黒ツリーの最小vruntimes間の累積差。

min_under_vruntime

優先度の低い赤黒ツリーの最小vruntime。