ある意味、先月のこの記事の続き。
6.12がリリースされたので、PREEMPT_RTとsched_extを試そうとしていて、必要なCONFIGを有効にするのに 少し見落としがあったのでメモ。
前提
- ビルド環境: Ubuntu 24.04.1(amd64)
- ツール類: 基本的にUbuntu bund版
PREEMPT_RTの有効化
長らく開発が続いてきて、とうとう6.12でmergeされて話題になっていたReal-Time機能のPREEMPT_RTを使ってみたいと思ったのが発端。
ビルドにあたって、make menuconfig
では、冒頭の"General Setup"の中で、私の条件では上から18番目、"BPF Subsystem"の次に出てくる
"Preemption Model"が該当する。
"Fully Preemptive Kernel (Real-Time)" を選択すればよい。
選べる詳細条件の確認は kernel/Kconfig.preempt を参照。
PREEMPT_RTで遊ぶには
realtime taskを動かせばよいのだが、 例えばrt-testsに含まれるcyclictestとかがよくつかわれるようだ。
sched_ext(CONFIG_SCHED_CLASS_EXT)の有効化
sched_extを使うと、eBPFでオレスケジューラを書いたりすることができる。
ビルドにあたって、make menuconfig
では、PREEMPT_RTと同じく "General Setup"の中で、"Preemption Model"の2つ下に出てくる"Extensible Scheduling Class"が該当する。
ハマりポイントとして、上記の項目がでてこないことがあるのだが、私の場合はpaholeがインストールされていなかったのが原因だった。sudo apt install pahole
した後でmake menuconfig
すると選べるようになる。
同じく選べるための詳細条件の確認は kernel/Kconfig.preempt を参照。
sched_extで遊ぶには
Linux kernelの tools/sched_ext にサンプルが一式ついている。README.mdに書いてある通りの使い方で素直に動く。
ビルドして起動したkernelで、無事にsched_extが有効になっているかどうかは sysfs 経由で確認できる。
/sys/kernel/sched_ext
が存在し、stateの中身で enabled/disabledがわかる。
以下は初期状態(=disabled)で、これから設定して使う。
$ ls -al /sys/kernel/sched_ext
total 0
drwxr-xr-x 2 root root 0 Mar 2 08:43 .
drwxr-xr-x 18 root root 0 Mar 2 08:10 ..
-r--r--r-- 1 root root 4096 Mar 2 08:25 enable_seq
-r--r--r-- 1 root root 4096 Mar 2 08:25 hotplug_seq
-r--r--r-- 1 root root 4096 Mar 2 08:25 nr_rejected
-r--r--r-- 1 root root 4096 Mar 2 08:25 state
-r--r--r-- 1 root root 4096 Mar 2 08:25 switch_all
$ cat /sys/kernel/sched_ext/state
disabled
$
以下、参考リンク
そのほか
もっとあったような気がするので別途追記/更新予定。