Linuxのソースコードから見れば、1分間、5分間と15分間の平均負荷量(load average)を取るように(例えば、cat /proc/loadavg)、fs/proc/loadavg.cget_avenrun()は呼び出される【※1】のが分かっています。そして、kernal/sched/loadavg.cにあるget_avenrun()のソースコード【※2】を見れば、単にavenrun[i]が1つ目の引数に代入されるのが分かっています。定期的にこの関数を呼び出すのは/proc/loadavgを更新できないわけです。

kernal/sched/loadavg.cには、グローバル変数のunsigned long avenrun[3]を書き込む関数は2つしかないです。

  • static void calc_global_nohz(void)
  • void calc_global_load(unsigned long ticks)

どのインターナルのプロセス或いはスレッドが上記の関数を定期的に呼び出しますか、或いは、別の方法でavenrun[3]が定期的に更新できますか。

また、その2つの関数の区別は何でしょうか。

※1 https://github.com/torvalds/linux/blob/345671ea0f9258f410eb057b9ced9cefbbe5dc78/fs/proc/loadavg.c#L17

※2 https://github.com/torvalds/linux/blob/345671ea0f9258f410eb057b9ced9cefbbe5dc78/kernel/sched/loadavg.c#L73