Linuxカーネル2.6.35以降で長時間起動しているとLoad Averageが高止まりする件


 自宅のルータとDBサーバで発生していたのだが、Linuxカーネル2.6.35〜2.6.36で起動し続けていると徐々にアイドルしていてもLoad Averageが高くなっていくっぽい。

kernel-2.6.35_high_load_average.png

 上記グラフは自宅ネットワークのゲートウェイサーバで、PPPoEルータの他にメール、DNS、リバースプロクシ、一部の死活監視と侵入監視を担っている。

 2.6.35に差し替えたのが9/29で差し替えたバージョンはGentooメインラインカーネルの2.6.35-gentoo-r9だが、この時点から徐々にロードアベレージが上がっている。用途上、そんなに負荷は上がらないマシンのはずなのだが……
 その後、2/11に明らかに負荷が下がっているが、この時点で2.6.37-gentooに差し替えている。

 過去、無線LANインターフェイスのハードウェア障害でロードアベレージが上がったことがあったが、少しググってみるとどうやら他にも困っている人がいるようなのでハードウェアの問題ではなさそうなので調べてみると、どうやらカーネル側の問題っぽい。

 “sched: Cure more NO_HZ load average woes” によると、別のパッチ (“sched: Cure load average vs NO_HZ woes”)でティックレスモードになったときのロードアベレージの計算を修正した際に、ティックレスモードを抜けるときについての修正が抜けていたのが問題らしい(“The problem is that the previous patch only solved half the NO_HZ problem, it addressed the part of going into NO_HZ mode, not of
comming out of NO_HZ mode.”)。2.6.37-gentooではこのパッチが当たっているので、ロードアベレージが元に戻った(ように見える)。正確には、ティックレスモードがenabledのときに(CONFIG_NO_HZ=y)無駄に負荷がかかっているのではなく、負荷がかかっているように見えていたというのが正しいだろうか。試してはいないが、ティックレスモードを潰しておけば(CONFIG_NO_HZ=n)発生しなさそうな気もする。