はじめに
この実験では、Linux でカーネルスケジューラの設定を確認する方法を学びます。スケジューラは、プロセスが CPU 時間を共有する方法を管理する基本的なコンポーネントです。その設定を理解することは、パフォーマンス分析とトラブルシューティングにおいて重要です。
実践的な手順を通じて、スケジューラの設定を調べる 3 つの方法を探ります。sysctl コマンドを使用してカーネルパラメータを表示する方法、スケジューラ関連のファイルを調べるために /proc/sys/kernel ファイルシステムを調べる方法、およびスケジューラ固有のメッセージを調べるために dmesg を介してカーネルログを調べる方法です。これらの手法は、スケジューラの現在の状態と動作について異なる視点を提供します。
sysctl kernel.sched でスケジューラ設定を確認する
このステップでは、sysctl コマンドを使用してカーネルのスケジューラ設定を確認する方法を探ります。スケジューラは、どのプロセスが CPU で実行されるか、およびどれだけの時間実行されるかを決定する Linux カーネルの重要な部分です。その設定を理解することは、パフォーマンスチューニングとトラブルシューティングに役立ちます。
sysctl コマンドは、実行時にカーネルパラメータを変更するために使用されます。また、これらのパラメータの現在の値を表示するためにも使用できます。カーネルパラメータは、ファイルシステムに似た階層構造で整理されています。
カーネルスケジューラに関連するパラメータを表示するには、kernel.sched 接頭辞を付けて sysctl を使用できます。
ターミナルが開いていない場合は、開きます。デスクトップの左側にある Xfce Terminal アイコンを見つけることができます。
次に、以下のコマンドを入力して Enter キーを押します。
sysctl kernel.sched
様々なスケジューラ関連のパラメータとその現在の値が表示される、次のような出力が表示されるはずです。
kernel.sched_child_runs_first = 0
kernel.sched_min_granularity_ns = 8000000
kernel.sched_wakeup_granularity_ns = 9000000
kernel.sched_latency_ns = 24000000
kernel.sched_migration_cost_ns = 50000
kernel.sched_nr_migrate = 32
kernel.sched_tunable_scaling = 1
kernel.sched_domain.cpu0.domain0 = ...
kernel.sched_domain.cpu0.domain1 = ...
...
正確な出力は、特定のカーネルバージョンとシステム構成によって多少異なる場合があります。このコマンドは、スケジューラが現在どのように構成されているかのスナップショットを提供します。
これらの各パラメータを理解することは、この入門実験の範囲を超えていますが、重要なポイントは、これらの設定を調べたい場合は sysctl kernel.sched コマンドを使用するということです。
Continue をクリックして次のステップに進みます。
/proc/sys/kernel でスケジューラを確認する
前のステップでは、sysctl を使用してカーネルパラメータを表示しました。これらのパラメータにアクセスし、場合によっては変更する別の方法は、/proc ファイルシステムを通じることです。/proc ファイルシステムは、プロセスに関する情報やその他のシステム情報を提供する仮想ファイルシステムです。
sysctl を介してアクセス可能なカーネルパラメータは、多くの場合、/proc/sys ディレクトリに反映されています。具体的には、スケジューラ関連のパラメータは /proc/sys/kernel/ 以下にあります。
このディレクトリに移動し、その内容を一覧表示しましょう。cd コマンドを使用してディレクトリを変更し、ls を使用してファイルとディレクトリを一覧表示します。
現在のディレクトリを /proc/sys/kernel/ に変更するには、以下のコマンドを入力します。
cd /proc/sys/kernel/
次に、このディレクトリ内のファイルを一覧表示します。
ls
長いファイルのリストが表示され、それぞれがカーネルパラメータを表しています。sched_ で始まるファイルを探します。これらのファイルは、sysctl で見た kernel.sched パラメータに対応しています。
...
sched_child_runs_first
sched_latency_ns
sched_migration_cost_ns
sched_min_granularity_ns
sched_nr_migrate
sched_rr_timeslice_ms
sched_rt_period_us
sched_rt_runtime_us
sched_shares_window_ns
sched_tunable_scaling
sched_wakeup_granularity_ns
...
cat などのコマンドを使用して、これらのファイルの内容を表示できます。たとえば、sched_latency_ns の値を表示するには、次のように入力します。
cat sched_latency_ns
数字が表示されるはずで、これは sysctl を使用したときの kernel.sched_latency_ns の値と同じです。
24000000
これは、sysctl kernel.sched が提供する情報が /proc/sys/kernel/ ディレクトリ内のファイルに由来することを示しています。sysctl はパラメータの表示と変更に便利なことが多いですが、/proc ファイルシステムを理解することで、カーネルが内部状態を公開する仕組みについてより深い理解が得られます。
Continue をクリックして次に進みます。
dmesg でスケジューラのログを調査する
この最後のステップでは、dmesg コマンドを使用して、スケジューラに関連するカーネルメッセージを確認します。dmesg は、カーネルのリングバッファメッセージを表示するコマンドです。これらのメッセージは、システムの起動時と実行時にカーネルによって生成され、ハードウェア、ドライバ、およびシステムイベント(スケジューラの活動を含む)に関する貴重な情報を含むことがあります。
sysctl と /proc/sys は現在の設定を表示しますが、dmesg はスケジューラの初期化や重要なイベントに関連するメッセージを表示することがあります。
カーネルメッセージを表示するには、以下のコマンドを入力します。
dmesg
これは、システム起動以来のすべてのカーネルメッセージを表示するため、非常に長い出力が表示される可能性があります。具体的にスケジューラに関連するメッセージを見つけるには、grep コマンドを使用して出力をフィルタリングできます。「sched」という単語を含む行を検索します。
以下のコマンドを入力します。
dmesg | grep sched
| 記号はパイプと呼ばれます。これは左側のコマンド (dmesg) の出力を受け取り、それを右側のコマンド (grep sched) の入力として送ります。grep sched は、受け取った入力の中から「sched」を含む行を検索します。
システム起動時のスケジューラに関連するメッセージが表示される、次のような出力が表示されるかもしれません。
[ 0.000000] Linux version ... (gcc version ...) #... SMP ...
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-... root=... ro quiet splash vt.handoff=...
[ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-... root=... ro quiet splash vt.handoff=...
[ 0.000000] PID scheduler: ...
[ 0.000000] Mount-cache hash table entries: ... (order: ..., 65536 bytes, linear)
[ 0.000000] Mountpoint-cache hash table entries: ... (order: ..., 65536 bytes, linear)
[ 0.000000] CPU: Testing write buffer coherency: ...
[ 0.000000] smpboot: CPU0: ...
[ 0.000000] setup_percpu: System has ... CPUs.
[ 0.000000] percpu: Embedded ... pages/cpu s...
[ 0.000000] pcpu: PCPU: ...
[ 0.000000] Built 1-level schedule group tree
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is ...
[ 0.000000] rcu: Adjusting scheduler-enlistment delay with ...
[ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=... to nr_cpu_ids=...
[ 0.000000] rcu: rcu_sched detected stalls on CPUs/tasks:
...
再び、正確な出力は異なる場合があります。このコマンドは、問題の診断や、カーネルによるスケジューラの初期化方法の理解に役立ちます。
これで、Linux カーネルスケジューラに関する情報を取得する 3 つの異なる方法を学びました。現在のパラメータには sysctl を使用し、/proc/sys/kernel/ 内のファイルを調査し、dmesg でカーネルメッセージを確認します。
Continue をクリックしてこの実験を完了します。
まとめ
この実験では、Linux でカーネルスケジューラの設定を確認する 2 つの主要な方法を学びました。まず、sysctl kernel.sched コマンドを使用して、さまざまなスケジューラ関連のパラメータとその現在の値を表示し、スケジューラの実行時設定のスナップショットを取得しました。
次に、/proc ファイルシステムを、カーネルパラメータにアクセスする別の方法として調査しました。特に、/proc/sys/kernel パスに焦点を当て、これは sysctl を介してアクセス可能なパラメータを反映しています。これらの手順では、コマンドラインユーティリティと仮想ファイルシステムの両方を通じて、カーネルスケジューラの設定を調査する方法を示しました。



