概要
Linuxシステムにおいてスケジューリングポリシーやリアルタイム優先度を細かく制御することは、遅延を最小限に抑えたいリアルタイム処理の性能を極限まで引き出すための基本技術です。本記事では、util-linuxパッケージに標準搭載されているchrtコマンドを用い、代表的なリアルタイムスケジューラ(FIFOおよびRR)の動作原理を把握しながら、実際のプロセスへ適用する流れを解説します。Ubuntu環境を前提に、必要なツールのセットアップからバックグラウンド処理の優先度変更、各種パラメータの監視手順までを網羅した実践的なチュートリアルをお届けします。
chrt対応スケジューリングポリシーと優先度範囲の確認
chrtコマンドを用いた検証環境を整えるため、関連ツール群を含むutil-linuxおよびprocpsパッケージのインストール状態を確認・更新します。

chrtは、対象プロセスのリアルタイムスケジューリング属性や優先順位を照会・調整するための管理コマンドです。-mオプションを付与して実行することで、現在稼働しているLinuxカーネルが対応しているポリシー一覧と、それぞれに設定可能な優先度の最小値・最大値を確認できます。
⚙️ [主要オプション一覧]
-m : システムがサポートするスケジューリング方式および優先度の有効範囲を出力-p : 対象となるプロセスID(PID)を指定してスケジューリング属性を参照または変更-f : 先行実行を原則とするリアルタイム先入れ先出し方式(SCHED_FIFO)を指定-r : 一定のタイムスライスで巡回実行するリアルタイムラウンドロビン方式(SCHED_RR)を指定-o : Linuxの標準的な時分割スケジューリング(SCHED_OTHER)を適用-b : バッチワークロード向けスケジューリング(SCHED_BATCH)を設定-i : システムアイドル時のみCPUを割り当てる超低優先度ポリシー(SCHED_IDLE)を指定-d : 処理期限に基づいた厳密なスケジューリング(SCHED_DEADLINE)を適用

稼働中プロセスにおける標準ポリシーおよび優先度の検証
スケジューリングポリシー変更の挙動を確認するために、まずsleep 600 &を実行して600秒間待機するバックグラウンドタスクを生成します。

直前に立ち上げたバックグラウンドプロセスのPIDを後続操作でスムーズに参照できるよう、TARGET_PID=$!を実行して環境変数へ退避させておきます。

chrt -pコマンドを実行し、該当プロセスに現在どのようなスケジューリング設定が施されているかを確認します。
初期状態では標準的な時分割スケジューラであるSCHED_OTHERが割り当てられており、優先度フィールドには既定の0が設定されていることが読み取れます。

続いてpsコマンドの-o出力フォーマット指定を使い、スケジューリングクラス(CLS)、リアルタイム優先度(RTPRIO)、カーネル内部優先度(PRI)の状態を詳細に調査します。
結果を見ると、通常の時分割クラス(TS)で動作しているためリアルタイム優先度(RTPRIO)は未設定(-)となっており、通常優先度の基準値である19が割り振られています。

リアルタイムスケジューリング(SCHED_FIFOおよびSCHED_RR)への動的切り替え
sudo chrt -f -p 50 $TARGET_PIDを実行し、対象プロセスのポリシーをリアルタイムFIFO方式(SCHED_FIFO)へと昇格させ、同時にリアルタイム優先度を50に設定します。
リアルタイムスケジューリングの適用はCPU時間の配分バランスを大幅に変化させるため、実行には管理者権限(sudo)が必要です。

設定変更が正常にカーネルへ反映されたかを検証するため、再びchrt -pを実行します。
出力内容から、スケジューリング方式が意図通りSCHED_FIFOへ移行し、リアルタイム優先度も50へ正しく更新されていることが確認できます。

今度はsudo chrt -r -p 30 $TARGET_PIDを実行し、ポリシーをリアルタイムラウンドロビン(SCHED_RR)へ切り替え、優先度を30へ再調整してみます。SCHED_RRポリシーを選択すると、同一の優先順位を持つタスク間で一定のタイムスライスごとにCPU利用権が公平に交代されるようになります。

改めてpsコマンドの-oオプションで、プロセスのクラス名(CLS)、リアルタイム優先度(RTPRIO)、内部優先度(PRI)を照会します。
スケジューリングクラスがRRへと更新され、RTPRIOに指定値30、カーネル優先度PRIには対応する70が正しく割り当てられていることが分かります。

リアルタイム属性を付与した新規プロセスの起動とリソースクリーンアップ
起動の初期段階からリアルタイムラウンドロビン(SCHED_RR)かつ優先度25を適用してバックグラウンド実行したい場合は、sudo chrt -r 25 sleep 300 &のように直接コマンドを指定して立ち上げます。chrtは既存プロセスの属性変更のみならず、新規バイナリの起動時から指定のリアルタイム特性を直接付与してプロセスを生成する用途にも活用できます。

ps -eo pid,cls,rtprio,comm | grep '[s]leep'を実行し、稼働中のsleepプロセス群におけるスケジューリング属性を横断的に一覧表示します。
先ほど変更を加えたプロセスと新規起動したプロセスの双方が、いずれもラウンドロビン(RR)ポリシーのもとで、それぞれ指定した優先度(30および25)で正しく動作している状態が確認できます。

一連の動作確認を終えた後、検証用に立ち上げたバックグラウンドタスクを安全に停止しシステムリソースを解放するため、kill -9 $TARGET_PID && pkill -f 'sleep 300'を実行します。
シェル変数で保持していたテストプロセスと追加起動した300秒待機プロセスの双方が一括で終了され、環境が元のクリーンな状態へと復帰します。

本稿では、chrtコマンドを使ったLinuxプロセスのリアルタイムスケジューリングポリシー設定および優先度調整の基礎を解説しました。
応答遅延が許されない重要サービスのチューニングや、高負荷環境下におけるプロセスリソースの適正配分を行う際に、ぜひ本手法を役立ててみてください。