2024-09-28

そして nohz_full へたどり着いた

CONFIG_NO_HZ_FULL からブートオプション nohz_full にたどり着きました。

LMDE 6 で Linux Kernel 6.10 という環境です。カーネルのビルドオプションで CONFIG_PREEMPT=y Preemptible Kernel (Low-Latency Desktop) を指定しています。

$ sudo cat /sys/kernel/debug/sched/preempt
none voluntary (full) 

Firefox というか「艦これ」の反応速度改善と省電力を目指しているのですが、この状態でカーネル起動オプションの nohz_full を試してみました。



まずは nohz_full=2-11 という指定です。6 コア 12 スレッドな CPU なのですが、先頭の 2 つはいじらずに 3 番目から 12 番目の CPU を adaptive-tick CPU に指定する、というものです。

cpu MHz		: 3101.817
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000

/proc/cpuinfo を抜き取った結果です。ちょっとタイミングが悪かったのですが、1 番目と 2 番目の CPU だけ常に動いているように見えます。

しかし、Firefox の反応速度は好感触です。キビキビしています。

 

続いて、nohz_full=6-11 という指定です。

cpu MHz		: 3183.382
cpu MHz		: 3467.285
cpu MHz		: 3026.825
cpu MHz		: 3467.767
cpu MHz		: 2793.213
cpu MHz		: 3308.353
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000

期待通りの結果ですが、Firefox の反応速度はさっきよりも落ちた感じがします。

 

そして、nohz_full を指定しないパターンです。

cpu MHz		: 2792.442
cpu MHz		: 3325.727
cpu MHz		: 2774.769
cpu MHz		: 3031.399
cpu MHz		: 400.000
cpu MHz		: 3008.046
cpu MHz		: 3009.508
cpu MHz		: 400.000
cpu MHz		: 3468.280
cpu MHz		: 3469.008
cpu MHz		: 2791.487
cpu MHz		: 3012.952

まあ、こうなりますよね、という見え方です。Firefox の反応速度はやはり落ちている感じがします。

最初のパターンが一番に反応速度が良かったのですが、1 番目と 2 番目の CPU しか使わないという偏りが気になりました。

「ん〜、コア数が少ない方が応答が良くなるのか。そうすると、SMT を off にすると良いのかな?」

ということで試してみました。

cpu MHz		: 3166.561
cpu MHz		: 3310.264
cpu MHz		: 3468.233
cpu MHz		: 3237.602
cpu MHz		: 3467.564
cpu MHz		: 2857.758

確かにちょっと反応速度が良くなった気がしますが、最初のパターンには及ばない感じです。



「最初のパターンは本当に 1 番目と 2 番目の CPU しか使われていないのだろうか?」

ということで、/proc/cpuinfo のスナップショットではなく、CPU 使用率のグラフで時系列に確認してみることにしました。

負荷が高い時はすべての CPU が使われている

 「システムモニター」で確認してみると一目瞭然でした。負荷がかかると 1 番目と 2 番目だけではなく他の CPU もちゃんと使われているようです。

これなら最初のパターンが一番いいですね、ということで GRUB のオプションに静的に定義することにしました。

/etc/default/grub.d/50_lmde.cfg

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nohz_full=2-11"
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

編集が終わったら、忘れずに反映させておきます。

$ sudo update-grub

これで次の PC 再起動時に取り込まれるようになります。

 

今日はいい仕事をしました。