tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

Load Average(ロードアベレージ)とCPU数

はじめに

業務中Load Averageを見ることが多いが
Load Averageについてあらためて自分のためにも整理&メモ

また、誰かに質問された際にええっとええっと。。。とならないように
質問されたらって仮定ですw
知ってるつもりなのに意外に答えられないんですよね(>_<)

Load Average

Load Averageってなに?(※こぴりました。

実行プロセス数(実行中プロセス数+実行可能プロセス数)

Load Averageが高いとなに?

語弊を恐れず言えば
Load Averageが高い ≒ サーバ負荷が高い ≒ 重い ≒ 応答速度が遅い

Load Averageが高いってどんな状態?もっとkwsk...的な

コマンド(uptimeなど)でLoad Averageを表示した場合に
Load Averageの値がCPUの数より大きい場合、「Load Averageが高い」( 負荷が高い、重い )
CPUの数はどうやってみるの?

Load Averageはどうやって見るの?

見るための代表的なコマンドとその例
コマンド)

uptime
top
w
sar

例)

# uptime
 23:05:31 up 96 days, 12:33, 11 users,  load average: 0.00, 0.00, 0.00←ココ
  • top (top後に1と入力:コア数ごとの使用率まで表示)
# top
top - 23:11:59 up 241 days,  7:10, 18 users,  load average: 5.11, 5.27, 3.62←ココ
Tasks: 1050 total,   1 running, 992 sleeping,   0 stopped,  57 zombie
Cpu0  :  7.0%us,  3.4%sy,  0.1%ni, 75.7%id, 13.4%wa,  0.1%hi,  0.3%si,  0.0%st
Cpu1  :  8.5%us,  3.1%sy,  0.1%ni, 87.5%id,  0.8%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  6.4%us,  2.2%sy,  0.1%ni, 90.6%id,  0.7%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  9.2%us,  3.2%sy,  0.1%ni, 86.8%id,  0.7%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  12298068k total, 12231068k used,    67000k free,  1724624k buffers
Swap:  2031608k total,    84356k used,  1947252k free,   369288k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3294 root      18   0  246m 219m  712 D  7.0  1.8   0:33.33 rsync
16354 hoge      15   0 11380 1824  796 R  4.2  0.0   0:00.06 top
 3028 root      18   0  3644  284  232 S  2.8  0.0   1615:29 readproctitle
  323 root      10  -5     0    0    0 S  1.4  0.0 210:26.58 kswapd0
    1 root      15   0 10348  680  572 S  0.0  0.0  33:09.67 init
    2 root      RT  -5     0    0    0 S  0.0  0.0  10:44.71 migration/0
    3 root      34  19     0    0    0 S  0.0  0.0   1:39.07 ksoftirqd/0
    :
    :
  • w
# w
 23:18:16 up 241 days,  7:16, 18 users,  load average: 3.86, 4.55, 3.80←ココ
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
hoge   pts/2    172.21.25.243    23:11    0.00s  0.03s  0.00s sshd: hoge [priv]
mone   pts/12   172.21.25.240:S. 10:31    5:33m  0.04s  0.02s ssh ixvm1
mone   pts/16   172.21.25.240:S. 10:41   10:16m  0.97s  0.96s ssh 192.168.42.31
mone   pts/17   172.21.25.240:S. 10:44    6:13m  0.04s  0.02s -/bin/tcsh
piyo   pts/19   172.21.25.246:S. 19Mar13  5days  1.11s  0.02s /bin/zsh
piyo   pts/38   172.21.25.246:S. 29Mar13  5:21m  0.29s  0.29s /bin/zsh
※詳しくはこちら→http://network.station.ez-net.jp/os/linux/operation/os/w/centos/5.4.asp
  • sar (sar -q 1 3)
# sar -q 1 3
Linux 2.6.18-194.26.1.el5 (hoge.co.jp)  2013年04月22日

23時24分58秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15←ココ
23時24分59秒         0      1181      2.64      4.04      3.93
23時25分00秒         0      1176      2.64      4.04      3.93
23時25分01秒         0      1176      2.64      4.04      3.93
平均値:             0      1178      2.64      4.04      3.93
 --------
※補足
q:実行キュー長さと、ロードアベレージを
1:1秒間隔で
3:3回表示

CPUの数の確認

CPUの数ってどうやってみるの?

/proc/cpuinfoを見る

例)

cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 23
model name	: Intel(R) Xeon(R) CPU           X3353  @ 2.66GHz
stepping	: 6
cpu MHz		: 2666.666
cache size	: 6144 KB
physical id	: 0
siblings	: 4
core id		: 0
cpu cores	: 4
apicid		: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 lahf_lm
bogomips	: 5333.33
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 1
ここからprocessorの数に応じて繰り返し(コマンド打って見てみてください
CPUの数(processor数)どうやって数えるの?

/proc/cpuinfoのprocessorの数を確認

# grep 'processor' /proc/cpuinfo
processor       : 0
processor       : 1
processor       : 2
processor       : 3
↑これがOSから見えるCPU(processor)の数分表示される。この例ではは4つ
OSから見えるCPUの数ってなに?

物理的に1つのCPUなんだけど、コアを2つ載せてる
とか
物理的に1つのコアなんだけど、HT技術で2倍にしてる
とか
マザーボードに物理的に2つのCPUを載せてる
とか。

詳細な説明はこのへん↓(長いので人任せにしますw
CPUやコアについて:http://homepage2.nifty.com/kamurai/CPU.htm#core
デュアルコアとは:http://e-words.jp/w/E38387E383A5E382A2E383ABE382B3E382A2.html
デュアルコアとデュアルプロセッサの違い:http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1110534276
デュアルコア誕生理由とメリット:http://www.tdk.co.jp/techmag/knowledge/200606u/index2.htm

物理的なCPUの数はわかるの?

/proc/cpuinfoのphysical idのid番号数をみる

# cat /proc/cpuinfo | grep 'physical id'
physical id     : 0
physical id     : 0
physical id     : 0
physical id     : 0
↑physical idがすべて0(番)なので、物理的なCPUは1つ
  2つ以上ある場合はphysical idが0、1のように番号が割り振られていく
物理的なコア数はわかるの?

/proc/cpuinfoのcpu coresの数やcore idでわかる

# cat /proc/cpuinfo | grep 'core id'
core id         : 0
core id         : 1
core id         : 2
core id         : 3
# cat /proc/cpuinfo | grep 'cpu cores'
cpu cores       : 4
cpu cores       : 4
cpu cores       : 4
cpu cores       : 4
↑coreのidが1〜4まで割り振られているので4つ。
また、今回の例で言うとcpu coresが4なので、'physical id = 0番のcpu'にcoresが4つ
結局まとめて言うとどうやって数えるの?
今回の例)
/proc/cpuinfoから
[結果]
processor   = 0〜3  = OSから見えるcpuの数 = 4

[内訳]
physical id = 0のみ = 物理的なcpu数       = 1
core cores  = 4     = 物理的なコア数        = 4 
ってことで、1つのcpuにコアが4つあるcpuで、OSからは4つに見えます。的な感じですかね

[図]
        CPU
┏━━━━━━━━┓
┃  コア    コア  ┃
┃┏━━┓┏━━┓┃
┃┃  ┃┃  ┃┃
┃┃  ┃┃  ┃┃
┃┗━━┛┗━━┛┃
┃┏━━┓┏━━┓┃
┃┃  ┃┃  ┃┃
┃┃  ┃┃  ┃┃
┃┗━━┛┗━━┛┃
┗━━━━━━━━┛
他の例は?

他の方のサイトでも解説されてるので、そちらをパクって参考にして説明します
こことか→http://d.hatena.ne.jp/moroto1122/20100917/1284719047

例)
# grep "processor" /proc/cpuinfo
processor : 0
processor : 1
(略)
processor : 15

# grep "physical id" /proc/cpuinfo | sort | uniq
physical id : 0
physical id : 1

# grep "siblings" /proc/cpuinfo
siblings : 8
siblings : 8

# grep "cpu cores" /proc/cpuinfo
cpu cores : 4
の場合

/proc/cpuinfoから
[結果]
processor   = 0〜15  = OSから見えるcpuの数 = 16

[内訳]
physical id = 0〜1   = 物理的なcpu数       = 2
siblings    = 8      = 1CPUにあるように見えるコア数 = 8
core cores  = 4      = 物理的なコア数        = 4
ってことで、物理的なCPUは2つ。
1つのCPUにコアが4つあり、そのコアがそれぞれHT(Hyper Threading)により2倍になってるので
OSからは16コに見える、って感じでしょうか。

[図]
        CPU1                 CPU2
┏━━━━━━━━┓ ┏━━━━━━━━┓
┃  コア    コア  ┃ ┃  コア    コア  ┃
┃┏━━┓┏━━┓┃ ┃┏━━┓┏━━┓┃
┃┃HT┃┃HT┃┃ ┃┃HT┃┃HT┃┃
┃┣----┫┣----┫┃ ┃┣----┫┣----┫┃
┃┃HT┃┃HT┃┃ ┃┃HT┃┃HT┃┃
┃┗━━┛┗━━┛┃ ┃┗━━┛┗━━┛┃
┃┏━━┓┏━━┓┃ ┃┏━━┓┏━━┓┃
┃┃HT┃┃HT┃┃ ┃┃HT┃┃HT┃┃
┃┣----┫┣----┫┃ ┃┣----┫┣----┫┃
┃┃HT┃┃HT┃┃ ┃┃HT┃┃HT┃┃
┃┗━━┛┗━━┛┃ ┃┗━━┛┗━━┛┃
┗━━━━━━━━┛ ┗━━━━━━━━┛

まとめ

Load Averageを表示することで値が高いと負荷は高そうってことはわかる
(CPU負荷かIO負荷かは別途切り分けが必要)
が、その値で負荷が高そうかどうかを判断するためには
CPUの数を鑑みて判断してね、と。