👻

Linux v5.13でスケジューラ関係のマニアックなsysctlパラメタが廃止された

2022/11/19に公開

Linuxのsysctlパラメタにはスケジューラ関係のものがいくつかあります。一部については以下の記事で解説しています。

https://zenn.dev/satoru_takeuchi/articles/08b8d0fdf4e711f47b2e

スケジューラに関するパラメタのうち、以下のものはv5.13以降で廃止され、同じことをするパラメタがdebugfs(Ubuntu20.04の場合は"/sys/debug/sched"以下に存在)に追加されました。

sched_min_granularity_ns
sched_latency_ns
sched_wakeup_granularity_ns
sched_tunable_scaling
sched_migration_cost_ns
sched_nr_migrate
numa_balancing_scan_delay_ms
numa_balancing_scan_period_min_ms
numa_balancing_scan_period_max_ms
numa_balancing_scan_size_mb

変更が入ったcommitは以下です。

https://github.com/torvalds/linux/commit/8a99b6833c884fa0e7919030d93fecedc69fc625

sched: Move SCHED_DEBUG sysctl to debugfs
Stop polluting sysctl with undocumented knobs that really are debug
only, move them all to /debug/sched/ along with the existing
/debug/sched_* files that already exist.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Tested-by: Valentin Schneider <valentin.schneider@arm.com>
Link: https://lkml.kernel.org/r/20210412102001.287610138@infradead.org

これらのパラメタはカーネルのビルド時にCONFIG_SCHED_DEBUGを有効にしていた場合のみ存在するもので、デバッグ用だけに存在するドキュメント化されていないものなので、"/sys/debug/sched"以下に移動させちゃおう、ということらしいです。

たとえばUbuntu20.04の場合は20.04.4まではカーネルv5.4(あるいはhweカーネルはv5.8)を使っていて、かつ、CONFIG_SCHED_DEBUGは有効になっているので上記パラメタは存在します。そして20.0.5からはカーネルv5.15を使うようになったので、これらのパラメタは消えました。

Linuxは普段ユーザ空間の互換性は壊さないんですが、デバッグ用途でドキュメント化されていないとはいえ、Ubuntuのようなメジャーなdistroに存在しているパラメタが消えるなんてことがあるんですね。ちょっとびっくりしました。あんまり使ってる人はいないとは思いますが、これらのパラメタを使ってマニアックなスケジューラのチューニングをしている人は今後はdebugfsに生えた新たなインタフェースをお使いください。

調査ログ

もともとは拙著の読者のかたから「本に書いてあるkernel.sched_latency_nsパラメタが存在しない」というご指摘をいただいたことによりこのことを知りました。

https://gihyo.jp/book/2022/978-4-297-13148-7

https://twitter.com/kotasukesanta/status/1592138879100125185

これはまずいなと思い、いつそんなことが起きたことを確認して正誤表を更新することにしました。調査方法は簡単で、Linuxのソースコードのバイナリサーチです。やるべきことは以下の通りです。

  1. sched_latency_nsパラメタが存在することがわかっているカーネルを見つける。ここではUbuntu20.04.4で使っているv5.4を使う。
  2. 上記パラメタが存在しないカーネルバージョンを見つける。ここではUbuntu20.04.5で使っているv5.15を使う。
  3. パラメタが存在するか否かをチェックする方法を見つける。ここではkernel/sysctl.cに"sched_latency_ns"の定義が存在するかどうかで判定できることがわかった。より簡単にいうと、grepで"sched_latency_ns"という文字列が存在するかを判定すればよい。
  4. 2つのバージョンの中間のバージョン(v5.((4+15)/2)=v5.9)にパラメタがあるか調べる。あればv5.10とv5.15の中間のバージョンにパラメタがあるか調べる。なければv5.5とv5.9の中間のバージョンにパラメタがあるか調べる。この要領で、パラメタがなくなったカーネルバージョンを特定する。

この方法は上述の通りバイナリサーチなので、目的のバージョンがO(log(n))の手間で見つかります[1]。v5.5で確認して、次にv5.6で確認して…と、一個づつ見ていくより、はるかに楽です。

この後「なんでsysctlパラメタを消して非互換仕込んだんだ?」と気になったので、「v5.12からv5.13までの間のどのコミットでパラメタが消されたのか」も確認しました。ここでもバイナリサーチを使ってもよかったので、"kernel/sysctl.c"はそれほど頻繁に変更されるファイルではないのでgit log --oneline v5.12..v5.13 -- kernel/sysctl.cを使って全commitをリストして、その中でそれっぽいコミットを見ていくことにしました。

$ git log --oneline -10 v5.12.. -- kernel/sysctl.c
df6f82370369 Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
08389d888287 bpf: Add kconfig knob for disabling unpriv bpf by default
ef4984384172 mm/compaction: remove unused variable sysctl_compact_memory
9d31d2338950 Merge tag 'net-next-5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next
3644286f6cbc Merge tag 'fsnotify_for_v5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
8a99b6833c88 sched: Move SCHED_DEBUG sysctl to debugfs
1d1c2509de44 sched: Remove sched_schedstats sysctl out from under SCHED_DEBUG
b7cc6ec744b3 sched/numa: Allow runtime enabling/disabling of NUMA balance without SCHED_DEBUG
cb9444130662 sysctl: add proc_dou8vec_minmax()
5b8fea65d197 fanotify: configurable limits via sysfs

この結果、いかにもなかんじのcommit 8a99b6833c88をgit showで見たら当たりだった、というわけです。

おしまい。正誤表も更新しました(該当箇所はP55)

脚注
  1. gitにはこういうことをするためのgit bisectというコマンドが存在します。 ↩︎

Discussion