Red Hat Training

A Red Hat training course is available for RHEL 8

34.3. ネットワーク遅延の改善

CPU 電力管理機能により、時間を考慮する必要があるアプリケーション処理に望ましくない遅延が発生する可能性があります。これらの電源管理機能の一部またはすべてを無効にして、ネットワーク遅延を改善できます。

たとえば、サーバーの負荷が高いときよりもアイドル状態のときの遅延が高い場合は、CPU 電源管理設定が遅延に影響を与える可能性があります。

重要

CPU 電源管理機能を無効にすると、電力消費量が増加し、熱損失が発生する可能性があります。

34.3.1. CPU の電源状態がネットワーク遅延に与える影響

CPU の消費状態 (C-状態) は、コンピューターの消費電力を最適化し、削減します。C-状態には、C0 から始まる番号が付けられます。C0 では、プロセッサーはフルパワーで動作し、実行しています。C1 では、プロセッサーはフルパワーで動作していますが、実行されていません。C-状態の番号が大きいほど、CPU がオフにするコンポーネントの数が多くなります。

CPU コアがアイドル状態になると常に、内蔵の省電力ロジックが介入し、さまざまなプロセッサーコンポーネントをオフにして、コアを現在の C-状態から上位の C-状態に移行しようとします。CPU コアがデータを処理する必要がある場合、Red Hat Enterprise Linux (RHEL) はプロセッサーに割り込みを送信してコアをウェイクアップし、C-状態を C0 に戻します。

ディープ C-状態から C0 に戻るには、プロセッサーのさまざまなコンポーネントの電源を再度オンにするため、時間がかかります。マルチコアシステムでは、多くのコアが同時にアイドル状態になり、より深い C-状態になることもあります。RHEL がそれらを同時にウェイクアップしようとすると、すべてのコアがディープ C-状態から戻る間に、カーネルが大量のプロセッサー間割り込み (IPI) を生成する可能性があります。割り込みの処理中にロックが必要となるため、システムはすべての割り込みの処理中にしばらく停止する可能性があります。これにより、イベントに対するアプリケーションの応答が大幅に遅延する可能性があります。

例34.2 コアごとの C-状態時間の表示

PowerTOP アプリケーションの Idle Stats ページには、CPU コアが各 C-状態で費やした時間が表示されます。

           Pkg(HW)  |            Core(HW) |            CPU(OS) 0   CPU(OS) 4
                    |                     | C0 active   2.5%        2.2%
                    |                     | POLL        0.0%    0.0 ms  0.0%    0.1 ms
                    |                     | C1          0.1%    0.2 ms  0.0%    0.1 ms
C2 (pc2)   63.7%    |                     |
C3 (pc3)    0.0%    | C3 (cc3)    0.1%    | C3          0.1%    0.1 ms  0.1%    0.1 ms
C6 (pc6)    0.0%    | C6 (cc6)    8.3%    | C6          5.2%    0.6 ms  6.0%    0.6 ms
C7 (pc7)    0.0%    | C7 (cc7)   76.6%    | C7s         0.0%    0.0 ms  0.0%    0.0 ms
C8 (pc8)    0.0%    |                     | C8          6.3%    0.9 ms  5.8%    0.8 ms
C9 (pc9)    0.0%    |                     | C9          0.4%    3.7 ms  2.2%    2.2 ms
C10 (pc10)  0.0%    |                     |
                    |                     | C10        80.8%    3.7 ms 79.4%    4.4 ms
                    |                     | C1E         0.1%    0.1 ms  0.1%    0.1 ms
...

34.3.2. EFI ファームウェアの C-状態設定

EFI ファームウェアを備えたほとんどのシステムでは、個々の消費状態 (C-状態) を有効または無効にすることができます。ただし、Red Hat Enterprise Linux (RHEL) では、アイドルドライバーによって、カーネルがファームウェアの設定を使用するかどうかが決定されます。

  • intel_idle: これは、Intel CPU を搭載したホスト上のデフォルトのドライバーであり、EFI ファームウェアからの C-状態設定を無視します。
  • acpi_idle: RHEL は、Intel 以外のベンダーの CPU を搭載したホスト上、および intel_idle が無効になっている場合に、このドライバーを使用します。デフォルトでは、acpi_idle ドライバーは EFI ファームウェアの C-状態設定を使用します。

関連情報

  • kernel-doc パッケージが提供する /usr/share/doc/kernel-doc-<version>/Documentation/admin-guide/pm/cpuidle.rst

34.3.3. カスタム TuneD プロファイルを使用した C-状態の無効化

TuneD サービスは、カーネルの Power Management Quality of Service (PMQOS) インターフェイスを使用して、消費状態 (C 状態) のロックを設定します。カーネルアイドルドライバーは、このインターフェイスと通信して C-状態を動的に制限できます。これにより、管理者がカーネルコマンドラインパラメーターを使用して、C-状態の最大値をハードコーディングする必要がなくなります。

前提条件

  • tuned パッケージがインストールされている。
  • tuned サービスが有効化され、実行されている。

手順

  1. アクティブなプロファイルを表示します。

    # tuned-adm active
    Current active profile: network-latency
  2. カスタム TuneD プロファイル用のディレクトリーを作成します。

    # mkdir /etc/tuned/network-latency-custom/
  3. 次の内容を含む /etc/tuned/network-latency-custom/tuned.conf ファイルを作成します。

    [main]
    include=network-latency
    
    [cpu]
    force_latency=cstate.id:1|2

    このカスタムプロファイルは、network-latency プロファイルからすべての設定を継承します。force_latency TuneD パラメーターは、遅延をマイクロ秒 (µs) 単位で指定します。C-状態のレイテンシーが指定された値よりも高い場合、Red Hat Enterprise Linux のアイドルドライバーは CPU がより高い C-状態に移行するのを防ぎます。force_latency=cstate.id:1|2 を指定すると、TuneD は最初に /sys/devices/system/cpu/cpu_<number>_/cpuidle/state_<cstate.id>_/ ディレクトリーが存在するかどうかを確認します。この場合、TuneD はこのディレクトリー内の latency ファイルからレイテンシー値を読み取ります。ディレクトリーが存在しない場合は、TuneD はフォールバック値として 2 マイクロ秒を使用します。

  4. network-latency-custom プロファイルをアクティブ化します。

    # tuned-adm profile network-latency-custom

34.3.4. カーネルコマンドラインオプションを使用した C-状態の無効化

processor.max_cstate および intel_idle.max_cstat カーネルコマンドラインパラメーターは、CPU コアが使用できる最大消費状態 (C-状態) を設定します。たとえば、パラメーターを 1 に設定すると、CPU は C1 より下の C-状態を要求しなくなります。

この方法を使用して、ホスト上のアプリケーションの遅延が C-状態の影響を受けているかどうかをテストします。特定の状態をハードコーディングしないようにするには、より動的なソリューションの使用を検討してください。Disabling C-states by using a custom TuneD profile を参照してください。

前提条件

  • tuned サービスが実行されていないか、C-状態設定を更新しないように設定されています。

手順

  1. システムが使用するアイドル状態のドライバーを表示します。

    # cat /sys/devices/system/cpu/cpuidle/current_driver
    intel_idle
  2. ホストが intel_idle ドライバーを使用している場合は、intel_idle.max_cstate カーネルパラメーターを設定して、CPU コアが使用できる最高の C-状態を定義します。

    # grubby --update-kernel=ALL --args="intel_idle.max_cstate=0"

    intel_idle.max_cstate=0 を設定すると、intel_idle ドライバーが無効になります。その結果、カーネルは、EFI ファームウェアで設定された C-状態値を使用する acpi_idle ドライバーを使用します。このため、これらの C-状態設定をオーバーライドするには、processor.max_cstate も設定します。

  3. すべてのホストで、CPU ベンダーから独立して、CPU コアが使用できる最高の C-状態を設定します。

    # grubby --update-kernel=ALL --args="processor.max_cstate=0"
    重要

    intel_idle.max_cstate=0 に加えて processor.max_cstate=0 を設定すると、acpi_idle ドライバーは processor.max_cstate の値をオーバーライドして 1 に設定します。その結果、processor.max_cstate=0 intel_idle.max_cstate=0 の場合、カーネルが使用する最高の C-状態は C0 ではなく C1 になります。

  4. 変更を有効にするためにホストを再起動します。

    # reboot

検証

  1. 最大の C-状態を表示します。

    # cat /sys/module/processor/parameters/max_cstate
    1
  2. ホストが intel_idle ドライバーを使用している場合は、最大の C-状態を表示します。

    # cat /sys/module/intel_idle/parameters/max_cstate
    0

関連情報