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

Alibaba Cloud Linux:グループID機能

最終更新日:Jul 10, 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内のプロセスタスクの優先順位を定義できます。

前提条件

説明
  • カーネル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機能が無効になっているため、グループID機能をサポートしていません。 uname -rコマンドを実行して、Alibaba Cloud Linux 3のカーネルバージョンを表示できます。

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

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

    yummakecache
    yuminstallscheduler-group-identity.x86_64 
  • カーネル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機能を使用する前に、echo 1 > /proc/sys/kernel/sched_group_identity_enabledコマンドを実行して機能を有効にする必要があります。

背景情報

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

  • 優先度の高いタスクは、最小の起動待ち時間を有する。

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

    • 低優先度タスクの起動は、高優先度タスクのパフォーマンスに影響を与えません。

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

グループID機能の仕組み

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

カーネルが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で実行される場合、低優先度タスクはピアSMT 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アイデンティティによって識別されるタスクがピアSMT CPUから追い出されます。

ID_IDLE_SEEKER

タスクが起動したときに、タスクがスケジューラーポリシーの制限内でアイドル状態の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インターフェイスはクイック設定インターフェイスです。 インターフェースの書き込まれた値は、アイデンティティに変換される。

    • cpu.identityおよびcpu.bvt_warp_nsインターフェイスを使用して、CPU 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インターフェイスを使用してカーネルスケジューリング機能のデフォルト設定を表示できます。

    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_UNDELCLASSタスクは完全に抑制され、ID_NORMALまたはID_HIGHCLASSタスクが実行中のタスクキューにある場合はスケジュールできません。 最悪のシナリオでは、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以降では、グループID機能を有効にできるように、/proc/sys/kernel/sched_group_identity_enabledインターフェイスが追加されています。 グループ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。

よくある質問

質問: カーネルバージョンを4.19.91-25.1.al7から4.19.91-25.5.al7から4.19.91-25.6.al7以降にアップグレードするにはどうすればよいですか?

回答: 次の手順を実行します。

  1. カーネルバージョンをアップグレードするElastic Compute Service (ECS) インスタンスにログインします。

    詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

  2. 次のコマンドを実行して、カーネルのバージョンを照会します。

    uname -r
  3. 次のコマンドを実行して、カーネルバージョンをアップグレードします。

    yum update kernel
  4. 次のコマンドを実行して、新しいカーネルバージョンを有効にするためにECSインスタンスを再起動します。

    reboot