僕は比較的引きこもりの情弱なので、割と大きな変化に気が付いてないことがある。 つい最近他の件で諸々調べていて、Linux kernel が tickless になっていることを知ったので、メモしておく。
tick
Linux はマルチタスク1 OS なので、定期的にタイマで割り込みを発生させてタスクを切り替えたり、時計を更新したりしている。この定期的な割り込みのことを tick とか、time tick とか呼んでいる。
割り込みの間隔は、コンパイル時の設定によって変わるけれど1秒間に100回とか250回とか1000回とかになっている。マクロ変数 HZ で定義されていてビルド時に CONFIG_HZ を設定することで、変えることができる。x86 アーキテクチャでは、大昔は 100 回がデフォルトだったけれど、CPU のクロックが増えたのに合わせて 1000 回に引き上げられ、今は 250 回になっている。
なので、tick の仕組みは必須で、変わらないと思っていたのだが今どきの kernel は tickless だという。
以下の2つの文書を参照しながら、まとめてみたいと思う。
本文中に都度参照を入れることはしないので、必要ならば上記文書を参照してください。どちらもそんなに長くないです。
なぜ tickless か?
長いことプロセスを切り替えるためのタイマ割り込みは必須だと思われていたけれど、タイマ割り込みを発生させないほうが良い場合があるそうだ。
例えば、以下の場合が該当する。
- HPC な人せっかく CPU を効率よく使おうと苦労してプログラムを書いたのに勝手に余計な処理をねじ込まれると遅くなるじゃないか。キャッシュも汚れるし。
- リアルタイムな人苦労して応答時間を管理しているのに余計な処理を入れられると困るよ。何とかインチキできんのか。
- 電力管理の人せっかく苦労して CPU の電力管理してるのに、余計な処理をするな。やることがないから、CPU 省電力モードにしているのに意味ないじゃないか。
他にも実行中のタスクが一つしかなかったら無理にタスク切り替えしなくてもいいんじゃないの?というのもある。
なので定期的な割り込みはできるだけ減らして、なるべくイベントドリブンで動かそうねということらしい。
もちろんまだ tick が必要な場合もある。
当然まだ定期的なタイマ割り込みを必要とする場合もある。
例えば時間というか時計の更新が該当する。がこれを全部のコアでやる必要はなくて時計の更新を担当するコアだけタイマを設定すればいい。
ちょっとややこしいのが、他のコアの処理を待っていて、一見該当コアは暇そうに見えるけれど、タイマで処理が終わるのを確認する必要がある場合。例えば rcu のコールバック処理が該当する。
アプリケーション側でタイマを設定している場合も、CPU を止めてしまうのはよくない。
あと tick を無効にする意味があまりない場合もある。例えば短い時間 CPU を使ってすぐに手放してしまうような、プロセスが多数ある場合。この場合、平均 CPU 使用率は低いけれど、だからといって止めてしまっても、復帰させるコストが高くなってしまうので、あまり意味がない。
最後に
まぁ、あまり役に立つ情報でもないかもしれないですが、ちょっとへぇーって思ってもらえたら幸いです。
チューニングガイドなどで、kernel boot パラメータに nohz=no を設定してみてください4 というときの nohz というのはこの tickless 機能のことです。
通常は適度な省電力機能が働いたほうがいいので特に変更する必要はないでしょう。
それではまた。