読者です 読者をやめる 読者になる 読者になる

sarコマンドでのLA

sarコマンドでのLA

       -q     Report queue length and load averages. The following values are displayed:

              runq-sz
                     Run queue length (number of tasks waiting for run time).

              plist-sz
                     Number of tasks in the task list.

              ldavg-1
                     System  load  average  for  the  last  minute.   The load average is calculated as the average number of runnable or running tasks (Rstate), and the number of tasks in uninterruptible sleep (D state) over the specified interval.

              ldavg-5
                     System load average for the past 5 minutes.

              ldavg-15
                     System load average for the past 15 minutes.

参考

d.hatena.ne.jp

sar もcat /proc/loadavg 1.72 1.99 3.68 3/372 18943 とLAが同じになるので /proc/loadavg から取得しているようだ。

/proc/loadavgは

つまり、CPU の数が増えてもロードアベレージは CPU の数でタスク数を平均したりはせず、純粋に「待ち行列にたまって待たされたタスクの数」を示しているのがここではっきりします。

待ち行列にたまって待たされたタスクの数」== number of runnable or running tasks (Rstate), and the number of tasks in uninterruptible sleep (D state)

ここで簡単にまとめておきます。 top や sar がデフォルトで示すCPU使用率はCPU数(コア数)で割り算をしている ロードアベレージは割り算をしていない

なるほど!

ここに一つ罠があるような気がします。カーネルは本当にすべての CPU に均等にタスクを割り当てているかどうか、という点です。先のデュアルコア x 2 = 4CPU の sar をもっと見てみましょう。

自分の環境ではsar -P ALL で見たCPUの使用率具合はほぼ均一だった。状況によってCPUへの割当が偏るとのこと。負荷をみるときは

sar -P ALL|CPU番号

したほうがよさそう。

top や sar がデフォルトで示すCPU使用率はCPU数(コア数)で割り算をしている。各CPUごとに値を保持している。 ロードアベレージは割り算をしていない。各CPU(ランキュー)ごとに値を保持するのではなく、システム全体で一つ。 4CPU ならロードアベレージ 4.00 まで OK、は鵜呑みにしないほうがよさそう。状況によって異なるのでその他の指標も使って細かく統計を分析>したほうがよい。 nr_running > 1 のときはロードバランスが適切に働く。そのため 4CPU なら 4.00 で割れ、というのは負荷があるときはそれなりに正しい。 ランキューに溜まってるタスク数が CPU 毎に見れたらいいのだけど、現時点のカーネルの実装では難しい。(全体のは sar -q で見れます。)