第3章 リアルタイム固有のチューニング

2章一般的なシステムチューニング で最適化が完了したら、Red Hat Enterprise Linux for Real Time 固有のチューニングを開始できます。この手順のために Red Hat Enterprise Linux for Real Time カーネルがインストールされている必要があります。

重要

このセクションのツールは、最初に 2章一般的なシステムチューニング を完了させてから使用してください。パフォーマンスは改善されません。
Red Hat Enterprise Linux for Real Time チューニングを開始する準備が整ったら、以下のステップを最初に実行してください。以下のステップでは、最大限のメリットを得られます。
本章のすべてのチューニング提案が完了したら、4章アプリケーションのチューニングとデプロイメント に進みます。

3.1. スケジューラーの優先順位の設定

Red Hat Enterprise Linux for Real Time カーネルを使用すると、スケジューラーの優先順位を詳細に制御できます。また、アプリケーションレベルのプログラムをカーネルスレッドよりも優先度の高い状態でスケジュールすることもできます。

警告

スケジューラーの優先度を設定すると、結果が生じる可能性があります。重要なカーネルプロセスが必要に応じて実行できなくなると、システムが応答しなくなり、その他の予測不可能な動作が発生する可能性があります。最終的に、正しい設定はワークロードに依存します。
優先順位は、特定のカーネル機能専用の一部のグループで定義されます。

表3.1 優先順位マップ

優先度 スレッド 詳細
1 優先度が低いカーネルスレッド 優先度 1 は通常、SCHED_OTHER を上になるタスクに対して予約されます。
2 - 49 利用可能 一般的なアプリケーションの優先順位に使用される範囲
50 デフォルトの hard-IRQ 値
51 - 98 優先度の高いスレッド この範囲は、定期的に実行され、応答時間が短くなければならないスレッドに使用します。中断が不足するため、CPU にバインドされたスレッドにはこの範囲を使用しないでください。
99 watchdogs および移行 最も優先度が高いシステムスレッド

手順3.1 systemd の使用による優先順位の設定

  • 優先度は、0 (最も低い優先度) から 99 (最も高い優先度) までの一連のレベルを使用して設定されます。systemd サービスマネージャーは、カーネル起動後のスレッドのデフォルト優先度を変更するために使用できます。
    実行中のスレッドのスケジューリングの優先度を表示するには、tuna ユーティリティーを使用します。
    ~]# tuna --show_threads
                          thread       ctxt_switches
        pid SCHED_ rtpri affinity voluntary nonvoluntary             cmd
      2      OTHER     0    0xfff       451            3        kthreadd  
      3       FIFO     1        0     46395            2     ksoftirqd/0  
      5      OTHER     0        0        11            1    kworker/0:0H  
      7       FIFO    99        0         9            1   posixcputmr/0 
    ...[output truncated]...
    

3.1.1. ブートプロセス中のサービスの優先度の変更

systemd ブートプロセス中に起動されるサービスのリアルタイム優先度を設定できるようにします。
ユニット設定ディレクティブ は、システムの起動プロセス中にサービスの優先度を変更するために使用されます。ブートプロセスの優先度の変更は、サービスセクションの以下のディレクティブを使用して行われます。
CPUSchedulingPolicy=
実行したプロセスの CPU スケジューリングポリシーを設定します。Linux で利用可能なスケジューリングクラスの 1 つを取ります。
  • その他
  • バッチ
  • idle
  • fifo
  • rr
CPUSchedulingPriority=
実行したプロセスの CPU スケジューリングの優先度を設定します。利用可能な優先度の範囲は、選択した CPU スケジューリングポリシーにより異なります。リアルタイムスケジューリングポリシーでは、1 (最も低い優先度) から 99 (最も高い優先度) の整数を使用できます。

例3.1 mcelog サービスの優先度の変更

以下の例では、mcelog サービスを使用します。mcelog サービスの優先度を変更するには、以下を実行します。
  1. 以下のように、/etc/systemd/system/mcelog.system.d/priority.conf で、補助 mcelog サービス設定ディレクトリーファイルを作成します。
    # cat <<-EOF > /etc/systemd/system/mcelog.system.d/priority.conf
    
  2. 以下を挿入します。
    [SERVICE]
    CPUSchedulingPolicy=fifo
    CPUSchedulingPriority=20
    EOF
    
  3. systemd スクリプト設定を再読み込みします。
    # systemctl daemon-reload
    
  4. mcelog サービスを再起動します。
    # systemctl restart mcelog
    
  5. 以下の systemd で設定した mcelog 優先度を表示します。
    $ tuna -t mcelog -P
    
    このコマンドの出力は、以下のようになります。
                        thread       ctxt_switches
      pid SCHED_ rtpri affinity voluntary nonvoluntary             cmd
    826     FIFO    20  0,1,2,3        13            0          mcelog
    
systemd ユニット設定ディレクティブ の変更の詳細は、システム管理者のガイドの「 既存のユニットファイルの変更の章を参照してください。

3.1.2. サービスの CPU 使用率の設定

systemd では、実行できる CPU サービスを指定できるようになります。
これを行うには、systemd は CPUAffinity= unit 設定ディレクティブ を使用します。

例3.2 mcelog サービスの CPU 使用率の設定

以下の例では、mcelog サービスが CPU 0 および 1 で実行されるように制限します。
  1. 以下のように、/etc/systemd/system/mcelog.system.d/affinity.conf で、補助 mcelog サービス設定ディレクトリーファイルを作成します。
    # cat <<-EOF > /etc/systemd/system/mcelog.system.d/affinity.conf
    
  2. 以下を挿入します。
    [SERVICE]
    CPUAffinity=0,1
    EOF
    
  3. systemd スクリプト設定を再読み込みします。
    # systemctl daemon-reload
    
  4. mcelog サービスを再起動します。
    # systemctl restart mcelog
    
  5. mcelog サービスが以下に制限される CPU を表示します。
    $ tuna -t mcelog -P
    
    このコマンドの出力は、以下のようになります。
                        thread       ctxt_switches
      pid SCHED_ rtpri affinity voluntary nonvoluntary             cmd
    12954   FIFO    20      0,1         2            1          mcelog
    
systemd ユニット設定ディレクティブ の変更の詳細は、システム管理者のガイドの既存のユニットファイルの変更の章を参照してください。