RHEL でのシステムパフォーマンス調整

Red Hat Enterprise LinuxBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、tuned を使用して RHEL システムのパフォーマンスを最適化し、nicerenice を使用してプロセスの優先度を管理する方法を学びます。まず、tuned のインストールを確認し、利用可能なプロファイルを一覧表示することから始めます。その後、tuned プロファイルを変更することがシステムパラメータにどのように影響するかを観察します。

この実験では、CPU 負荷の高いプロセスを開始して監視し、次に nicerenice を使用してそれらの優先度を調整し、リソース割り当てへの影響を理解します。最後に、実行中のプロセスをクリーンアップする方法を学び、RHEL でのパフォーマンスチューニングに関する完全な理解を深めます。

tuned のステータス確認と利用可能なプロファイルのリスト表示

このステップでは、tuned デーモンのステータスを確認し、RHEL システムで利用可能なチューニングプロファイルを一覧表示する方法を学びます。tuned は、特定のワークロードのパフォーマンスを最適化するためにシステム設定を調整する、動的な適応型システムチューニングデーモンです。チューニングプロファイルを使用して、一連のシステムワイド設定を適用します。

  1. tuned デーモンが実行されていることを確認します
    このコンテナ環境では、tuned デーモンが実行されているかどうかを、そのプロセスを探すことで確認します。また、コマンドに応答するかどうかを確認することで、その機能を検証することもできます。

    まず、tuned プロセスが実行されているか確認します。

    pgrep tuned

    tuned が実行されている場合、このコマンドはプロセス ID (PID) を返します。PID が返されない場合は、デーモンを手動で起動できます。

    sudo /usr/sbin/tuned &

    次に、実行されていることを確認します。

    pgrep tuned

    次のような出力が表示されるはずです。

    739

    (注:出力の PID 値は異なります。)

    さらに、tuned がステータスのクエリに応答するかどうかを確認することで、tuned が機能していることを確認できます。

    sudo tuned-adm active

    これにより、現在アクティブなプロファイルがエラーなしで返されるはずです。

  2. 利用可能なチューニングプロファイルを一覧表示し、アクティブなプロファイルを特定します
    tuned-adm list コマンドは、利用可能なすべてのチューニングプロファイルを表示し、現在アクティブなものを強調表示します。

    sudo tuned-adm list

    パスワードの入力を求められます。出力の Current active profile に注目してください。

    Available profiles:
    - accelerator-performance     - Throughput performance based tuning with disabled higher latency STOP states
    - aws                         - Optimize for aws ec2 instances
    - balanced                    - General non-specialized tuned profile
    - balanced-battery            - Balanced profile biased towards power savings changes for battery
    - desktop                     - Optimize for the desktop use-case
    - hpc-compute                 - Optimize for HPC compute workloads
    - intel-sst                   - Configure for Intel Speed Select Base Frequency
    - latency-performance         - Optimize for deterministic performance at the cost of increased power consumption
    - network-latency             - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
    - network-throughput          - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
    - optimize-serial-console     - Optimize for serial console use.
    - powersave                   - Optimize for low power consumption
    - throughput-performance      - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
    - virtual-guest               - Optimize for running inside a virtual guest
    - virtual-host                - Optimize for running KVM guests
    Current active profile: virtual-guest
  3. virtual-guest プロファイルの設定を確認します
    virtual-guest プロファイルは、仮想マシンのデフォルトであることがよくあります。その設定ファイルを調べて、どのような設定が適用されているかを理解できます。

    cat /usr/lib/tuned/virtual-guest/tuned.conf

    このコマンドは、virtual-guest プロファイルの tuned 設定を表示します。これには、他のプロファイルから継承するパラメータが含まれます。

    #
    ## tuned configuration
    #
    
    [main]
    summary=Optimize for running inside a virtual guest
    include=throughput-performance
    
    [vm]
    ## If a workload mostly uses anonymous memory and it hits this limit, the entire
    ## working set is buffered for I/O, and any more write buffering would require
    ## swapping, so it's time to throttle writes until I/O can catch up.  Workloads
    ## that mostly use file mappings may be able to use even higher values.
    #
    ## The generator of dirty data starts writeback at this percentage (system default
    ## is 20%)
    dirty_ratio = 30
    
    [sysctl]
    ## Filesystem I/O is usually much more efficient than swapping, so try to keep
    ## swapping low.  It's usually safe to go even lower than this on systems with
    ## server-grade storage.
    vm.swappiness = 30
  4. vm.dirty_background_ratio パラメータが適用されていることを確認します
    virtual-guest プロファイルには throughput-performance が含まれています。throughput-performance が通常設定するパラメータ、たとえば vm.dirty_background_ratio を確認してみましょう。このパラメータは、システムがバックグラウンドでダーティページをディスクに書き込み始めるタイミングを制御します。

    sysctl vm.dirty_background_ratio

    出力には、このカーネルパラメータの現在の値が表示されます。

    vm.dirty_background_ratio = 10

tuned プロファイルの変更とシステムパラメータの変化の観察

このステップでは、アクティブな tuned プロファイルを変更し、システムパラメータへの即時的な影響を観察する方法を学びます。tuned プロファイルを変更することで、スループット集約型のタスクや省電力など、さまざまなワークロードに合わせて調整された一連のパフォーマンス最適化をすばやく適用できます。

  1. 現在のアクティブなチューニングプロファイルを throughput-performance に変更します
    throughput-performance プロファイルは、ある程度のレイテンシを犠牲にしてでも、高いスループットを必要とするシステム向けに設計されています。通常、ディスク I/O とネットワークパフォーマンスを最適化します。tuned-adm profile コマンドを使用して、プロファイルを切り替えます。

    sudo tuned-adm profile throughput-performance

    パスワードの入力を求められます。

    $ sudo tuned-adm profile throughput-performance
    [sudo] password for user:
  2. 新しいアクティブなプロファイルを確認します
    プロファイルを変更した後、新しいプロファイルが実際にアクティブであることを確認することをお勧めします。これは、tuned-adm active を使用して行うことができます。

    sudo tuned-adm active

    出力には、throughput-performance がアクティブなプロファイルとして表示されるはずです。

    Current active profile: throughput-performance
  3. vm.dirty_ratio および vm.swappiness パラメータが変更されたことを確認します
    throughput-performance プロファイルは、vm.dirty_ratiovm.swappiness など、メモリ管理に関連するカーネルパラメータを変更します。virtual-guest プロファイルは throughput-performance から継承しますが、throughput-performance プロファイルに直接切り替えると、virtual-guest 固有の変更なしに基本値が適用されます。

    • vm.dirty_ratio: このパラメータは、システムがダーティページ (変更されたがまだディスクに書き込まれていないページ) で埋めることができるシステムメモリの最大割合を定義します。値が大きいほど、より多くのデータをメモリにバッファリングできるため、スループットが向上する可能性があります。
    • vm.swappiness: このパラメータは、カーネルが匿名メモリ (アプリケーションデータ) を RAM からスワップ領域にどの程度積極的にスワップアウトするかを制御します。値が小さいほど、カーネルはより多くのアプリケーションデータを RAM に保持しようとします。これは一般的にパフォーマンスにとって優れています。

    sysctl を使用して、現在の値を確認してみましょう。

    sysctl vm.dirty_ratio
    sysctl vm.swappiness

    virtual-guest プロファイルの設定 (dirty_ratio = 30, vm.swappiness = 30) から、基本の throughput-performance プロファイルの値に変更されたことを確認する必要があります。

    vm.dirty_ratio = 40
    vm.swappiness = 10

    (注:これらの値は、virtual-guest 固有の変更なしに、基本の throughput-performance 最適化を反映しています。)

RHEL で CPU 負荷の高いプロセスを開始し、監視する

このステップでは、CPU 負荷の高いプロセスを開始し、そのリソース使用量を監視する方法を学びます。これは、プロセスがシステムリソースをどのように消費しているかを理解し、ボトルネックを特定するために不可欠です。sha1sum /dev/zero コマンドを使用します。このコマンドは、無限のゼロのストリームの SHA1 チェックサムを継続的に計算し、効果的に CPU サイクルを消費します。

重要: この演習では、デバイスファイルに対して無限のチェックサムを実行し、意図的に大量の CPU リソースを消費するコマンドを使用します。この演習を終了するか、次のラボに進む前に、すべての演習プロセスを終了する必要があります。

  1. システム上の CPU コアの数を決定します
    CPU コアの数を理解することで、システムを完全に活用するために実行する CPU 負荷の高いプロセスの数を決定できます。この情報は、/proc/cpuinfo で確認できます。

    grep -c '^processor' /proc/cpuinfo

    このコマンドは、processor で始まる行数をカウントします。これは、論理 CPU コア (または仮想プロセッサ) の数に対応します。

    2

    (注:システムの構成によっては、出力に異なる数のコアが表示される場合があります。)

  2. CPU コアごとに sha1sum /dev/zero & コマンドの 2 つのインスタンスを開始します
    高負荷のシステムをシミュレートするために、sha1sum /dev/zero & の複数のインスタンスを開始します。コマンドの末尾にある & は、プロセスをバックグラウンドで実行し、ターミナルを引き続き使用できるようにします。たとえば、2 つの CPU コアがある場合は、4 つのインスタンス (2 インスタンス/コア * 2 コア) を開始します。

    for i in $(seq 1 $(grep -c '^processor' /proc/cpuinfo | awk '{print $1 * 2}')); do sha1sum /dev/zero & done

    このコマンドは、CPU コア数に基づいて開始するプロセスの数を動的に計算します。

    [1] 1234
    [2] 1235
    [3] 1236
    [4] 1237

    (注:出力の PID 値は、例とは異なります。)

  3. バックグラウンドジョブが実行されていることを確認します
    jobs コマンドは、シェルセッションから現在バックグラウンドで実行されているすべてのプロセスを一覧表示します。

    jobs

    開始したばかりの sha1sum プロセスのリストが表示されるはずです。

    [1]   Running                 sha1sum /dev/zero &
    [2]   Running                 sha1sum /dev/zero &
    [3]   Running                 sha1sum /dev/zero &
    [4]-  Running                 sha1sum /dev/zero &
  4. ps および pgrep コマンドを使用して、各 sha1sum プロセスの CPU 使用率 (%) を表示します
    ps コマンドは、現在のプロセスのスナップショットを報告します。これと pgrep を組み合わせて、sha1sum プロセスをフィルタリングします。

    • ps -o pid,pcpu,nice,comm: これは、出力形式を指定します。プロセス ID (pid)、CPU 使用率の割合 (pcpu)、nice 値 (nice)、およびコマンド名 (comm)。
    • $(pgrep sha1sum): このコマンド置換は、sha1sum という名前のすべてのプロセスの PID を見つけ、それらを ps への引数として渡します。
    ps -o pid,pcpu,nice,comm $(pgrep sha1sum)

    sha1sum プロセスが CPU のかなりの割合を消費していることがわかります。

        PID %CPU  NI COMMAND
       5248 48.8   0 sha1sum
       5249 48.7   0 sha1sum
       5250 48.8   0 sha1sum
       5251 48.8   0 sha1sum

    (注:%CPU の値は変動する可能性がありますが、高いはずです。これは、CPU 使用率が高いことを示しています。NI 列は nice 値を示しています。)

  5. 実行中のすべての sha1sum プロセスを終了し、何も残っていないことを確認します
    続行する前に、これらの CPU 負荷の高いプロセスをクリーンアップすることが重要です。pkill コマンドは、名前に基づいてプロセスを終了します。

    pkill sha1sum

    次に、バックグラウンドで sha1sum ジョブが実行されていないことを確認します。

    jobs

    出力が空であるか、すべてのジョブが終了したことを示しているはずです。

    [1]   Terminated              sha1sum /dev/zero
    [2]   Terminated              sha1sum /dev/zero
    [3]   Terminated              sha1sum /dev/zero
    [4]-  Terminated              sha1sum /dev/zero

    (注:プロセスが停止しているため、「Terminated」メッセージが表示される場合があります。)

RHEL で nice および renice を使用してプロセスの優先度を調整する

このステップでは、nice および renice コマンドを使用して、プロセスのスケジューリング優先度に影響を与える方法を学びます。プロセスの nice 値 (別名 niceness) は、Linux スケジューラに対するその優先度を示します。nice 値が低い (より負の値) ほど優先度が高く、nice 値が高い (より正の値) ほど優先度が低くなります。nice 値の範囲は通常、-20 (最高優先度) から 19 (最低優先度) で、0 がデフォルトです。

  1. sha1sum /dev/zero & の複数のインスタンスを開始し、次に nice レベルが 10 の追加のインスタンスを 1 つ開始します
    ビジー状態のシステムをシミュレートするために、いくつかの sha1sum プロセスを開始します。次に、意図的に低い優先度 (高い nice 値) で 1 つを開始し、その影響を観察します。

    まず、3 つの通常のインスタンスを開始します (必要に応じて CPU コア数に基づいて調整しますが、競合を作成するために仮想プロセッサと同じ数以上にする必要があります)。

    for i in {1..3}; do sha1sum /dev/zero & done

    次に、nice レベルが 10 の 4 番目のインスタンスを開始します。このプロセスは、他のプロセスよりも低い優先度を持ちます。

    nice -n 10 sha1sum /dev/zero &

    次のような出力が表示され、バックグラウンドプロセスの PID が示されます。

    [1] 5443
    [2] 5444
    [3] 5445
    [4] 5446

    (注:出力の PID 値は異なります。)

  2. ps および pgrep コマンドを使用して、各プロセスの PID、CPU 使用率 (%)、nice 値、および実行可能ファイル名を表示します
    %CPU および NI 列を観察します。nice 値が 10 のインスタンスは、他のインスタンスよりも低い CPU 使用率 (%) を表示する必要があります。これは、スケジューラがそのインスタンスに CPU 時間を少なく与えるためです。

    ps -o pid,pcpu,nice,comm $(pgrep sha1sum)

    NI 値が 10 のプロセスを探します。その %CPU は、他のプロセスよりも著しく低いはずです。

        PID %CPU  NI COMMAND
       5443 56.8   0 sha1sum
       5444 58.0   0 sha1sum
       5445 56.5   0 sha1sum
       5446  6.7  10 sha1sum

    (注:正確な %CPU 値は、システムの負荷とコア数によって異なりますが、nice 10 のプロセスはより低い割合を持つはずです。)

  3. sudo renice コマンドを使用して、通常のプロセスの 1 つの nice レベルを 5 に変更します
    renice コマンドを使用すると、すでに実行中のプロセスの nice 値を変更できます。これを実証するために、通常のプロセスの 1 つ (nice 値 0) を nice 値 5 に変更します。

    まず、前の ps コマンドの出力から、nice 値が 0 の sha1sum プロセスの 1 つの PID を特定します。上記の例の最初のもの (PID 5443) を使用しましょう。

    sudo renice -n 5 <PID_of_regular_process>

    <PID_of_regular_process> を、特定した実際の PID に置き換えます。例:

    sudo renice -n 5 5443

    優先度の変更を確認する出力が表示されるはずです。

    5443 (process ID) old priority 0, new priority 5
  4. ps および pgrep コマンドを繰り返し実行して、CPU 使用率 (%) と nice レベルを表示します
    nice 値を変更したプロセスの CPU 使用率の変化を観察します。nice 値 5 のプロセスは、nice 値 0 のプロセスと比較して CPU 使用率がわずかに低くなっているはずですが、nice 値 10 のプロセスよりも高くなっています。

    ps -o pid,pcpu,nice,comm $(pgrep sha1sum)

    変更されたプロセスの NI 値が現在 5 であり、その CPU 使用率が新しい優先度レベルを反映していることがわかります。

        PID %CPU  NI COMMAND
       5443 55.4   5 sha1sum
       5444 67.2   0 sha1sum
       5445 67.1   0 sha1sum
       5446  7.5  10 sha1sum

    (注:正確な %CPU 値は異なりますが、nice 値が低い (優先度が高い) プロセスがより多くの CPU 時間を取得することを確認する必要があります。)

実行中のプロセスをクリーンアップ

この最終ステップでは、実験中に開始されたすべてのバックグラウンドプロセスが適切に終了していることを確認します。これは、意図しないリソース消費を防ぎ、今後の使用のために実験環境をリセットするための重要なクリーンアップステップです。

  1. pkill コマンドを使用して、sha1sum という名前パターンを持つすべての実行中のプロセスを終了します
    pkill コマンドは、名前に基づいてシグナル (デフォルトでは SIGTERM) をプロセスに送信するための効率的な方法です。これにより、前のステップで開始したすべての sha1sum プロセスが停止します。

    pkill sha1sum

    プロセスが終了したことを示すメッセージが表示される場合があります。

    [3]-  Terminated              sha1sum /dev/zero
    [2]-  Terminated              sha1sum /dev/zero
    [4]+  Terminated              nice -n 10 sha1sum /dev/zero
    [1]+  Terminated              sha1sum /dev/zero
  2. sha1sum プロセスがまだ実行されていないことを確認します
    pgrep を使用して、sha1sum プロセスがまだアクティブかどうかを確認できます。pgrep が出力を返さない場合、そのようなプロセスは実行されていません。

    pgrep sha1sum

    このコマンドは出力を返さないはずです。これは、すべての sha1sum プロセスが正常に終了したことを示しています。

    $ pgrep sha1sum
    $

まとめ

この実験では、RHEL でシステムパフォーマンスの最適化のために tuned を管理し、利用する方法を学びました。まず、tuned サービスのインストールとステータスを確認し、利用可能なチューニングプロファイルを一覧表示することから始めました。これらのプロファイルを使用して、tuned が特定のワークロードに合わせてシステム設定を動的に調整することを理解しました。次に、labex ユーザーとして SSH 経由でシミュレートされた servera 環境にログインし、dnf list tuned を使用して tuned パッケージのインストールを確認しました。

この実験ではさらに、tuned プロファイルを変更してシステムパラメータへの影響を観察し、さまざまなプロファイルがシステムの動作をどのように変更できるかを実証しました。また、CPU を集中的に使用するプロセスを開始および監視する実践的な経験も得ました。これは、パフォーマンスのボトルネックを特定するために不可欠です。最後に、nice および renice コマンドを使用してプロセスの優先度を調整し、リソース割り当てを効果的に管理する方法を学び、実行中のプロセスをクリーンアップしてシステムを初期状態に戻すことで締めくくりました。