はじめに
リソース確認系コマンドの使いドコロ、切り分けの勘所を自分メモ用に軽くまとめました。
内容は随時追加・アップデートしていければよいなという趣きですはい。
サーバ負荷を見極める指標
サーバ負荷は大きく以下の2つに分けられます
- CPU負荷
- I/O負荷
負荷状況を確認する指標
- ロードアベレージ
- CPU使用率
- I/O負荷
- メモリ
確認したい負荷状況指標
ロードアベレージ
ロードアベレージとは
簡単に言うと、実行待ちのプロセス数のことで、もう少し詳しく言うと、
CPUの実行権限付与待ちのプロセスとディスクI/O完了待ちプロセスの総数ということですかね。
※これ以上はLinuxカーネル周りの話になってきてしまうので割愛致しますというかよくわかりませんorz
ロードアベレージの指標
基本的にはロードアベレージは1未満がベストですが、
マルチコアなどの場合は少し注意が必要のようです。
くわしくはこちらに素晴らしい記事がございますのでご参照下さい。
掻い摘んでいうと
(負荷があるとき && 均等に分散される場合は)
「ロードアベレージは CPU の数で割った数値を見る!」
と言うことでしょうかね。
ロードアベレージを確認できるコマンド
w
top
sar -q
uptime
[root@centos6 ~]# uptime
10:56:26 up 10 min, 2 users, load average: 0.00, 0.06, 0.07
w
[root@centos6 ~]# w
11:01:33 up 15 min, 1 users, load average: 0.00, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 172.21.1.48 10:46 0.00s 0.01s 0.00s w
top
[root@centos6 ~]# top
top - 11:05:03 up 18 min, 2 users, load average: 0.00, 0.01, 0.03
Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.7%us, 0.7%sy, 0.0%ni, 95.9%id, 1.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1922252k total, 535812k used, 1386440k free, 17324k buffers
Swap: 1675260k total, 0k used, 1675260k free, 417308k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19356 1540 1228 S 0.0 0.1 0:00.95 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
7 root 20 0 0 0 0 S 0.0 0.0 0:00.05 events/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events/0
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_long/0
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_power_ef
sar -q
[root@centos6 ~]$ sar -q 1 10
Linux 2.6.32-573.8.1.el6.x86_64 (centos6.jp) 2015年12月24日 _x86_64_ (16 CPU)
12時52分37秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
12時52分38秒 0 961 0.32 0.28 0.23
12時52分39秒 0 960 0.32 0.28 0.23
12時52分40秒 0 960 0.32 0.28 0.23
12時52分41秒 0 960 0.32 0.28 0.23
12時52分42秒 0 960 0.29 0.27 0.23
12時52分43秒 0 960 0.29 0.27 0.23
12時52分44秒 1 960 0.29 0.27 0.23
12時52分45秒 0 960 0.29 0.27 0.23
12時52分46秒 0 960 0.29 0.27 0.23
12時52分47秒 0 960 0.27 0.27 0.23
平均値: 0 960 0.30 0.27 0.23
CPU
CPUとは
CentralProcessingUnitの略で「中央処理装置」という意味です。
詳細はこちらをご確認下さい。
CPU使用率
基本的にCPUのリソース状況を見る時にはCPUの使用率を見ると言い換えて差し支えないと思いますので、各コマンドと共にCPU使用率の見方を見ていきます。
CPU使用率を確認できるコマンド
top
sar -u
sar -P
top
マルチコアの場合top
コマンド後に1
を押下するとコア数毎のCPU使用率の情報が表示されます。
top
コマンドはCPUの利用についての情報を占有時間の割合で表示しています。
[root@centos6 ~]# top
top - 12:21:00 up 6 days, 16:33, 1 user, load average: 0.39, 0.34, 0.28
Tasks: 946 total, 1 running, 945 sleeping, 0 stopped, 0 zombie
Cpu0 : 0.3%us, 0.3%sy, 0.1%ni, 99.2%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.1%us, 0.3%sy, 0.0%ni, 99.5%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.2%us, 0.3%sy, 0.0%ni, 99.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.0%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu4 : 0.1%us, 0.5%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu5 : 0.0%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu6 : 0.0%us, 0.2%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu7 : 0.0%us, 0.2%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu8 : 0.0%us, 0.2%sy, 0.1%ni, 99.6%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu9 : 0.0%us, 0.1%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu10 : 0.0%us, 0.1%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu11 : 0.0%us, 0.1%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu12 : 0.0%us, 0.1%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu13 : 0.0%us, 0.1%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu14 : 0.0%us, 0.1%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu15 : 0.0%us, 0.1%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16332608k total, 6501420k used, 9831188k free, 250696k buffers
Swap: 8232956k total, 0k used, 8232956k free, 4524892k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
79 root 20 0 0 0 0 S 0.5 0.0 0:12.60 events/12
12793 webmail 20 0 15700 1936 928 R 0.5 0.0 0:00.03 top
各項目について
項目 | 内容 |
---|---|
us | ユーザプロセス(プログラムを実行することによって生成されるプロセス)の使用時間 |
sy | システムプロセス(OSによって生成されるプロセス)の使用時間 |
ni | 実行優先度(nice値)を変更したユーザプロセスの使用時間 |
id | アイドル状態の使用時間 |
wa | I/O終了待ちをしている時間 |
hi | ハードウェア割込み要求での使用時間 |
si | ソフトウェア割込み要求での使用時間 |
st | CPUリソースを割り当ててもらえなかった時間 |
sar -u
[root@centos6 ~]$ sar -u 1 10
Linux 2.6.32-573.8.1.el6.x86_64 (centos6.jp) 2015年12月25日 _x86_64_ (16 CPU)
17時32分15秒 CPU %user %nice %system %iowait %steal %idle
17時32分16秒 all 0.00 0.00 0.19 0.00 0.00 99.81
17時32分17秒 all 0.12 0.00 0.25 0.00 0.00 99.62
17時32分18秒 all 0.06 0.00 0.13 0.00 0.00 99.81
17時32分19秒 all 0.06 0.00 0.25 0.00 0.00 99.69
17時32分20秒 all 0.00 0.06 0.13 0.00 0.00 99.81
17時32分21秒 all 0.06 0.00 0.19 0.00 0.00 99.75
17時32分22秒 all 0.06 0.00 0.13 0.00 0.00 99.81
17時32分23秒 all 0.00 0.00 0.06 0.00 0.00 99.94
17時32分24秒 all 0.00 0.06 0.19 0.00 0.00 99.75
17時32分25秒 all 0.06 0.06 0.19 0.00 0.00 99.69
平均値: all 0.04 0.02 0.17 0.00 0.00 99.77
[root@centos6 ~]$ sar -P ALL 1 1
Linux 2.6.32-573.8.1.el6.x86_64 (centos6.jp) 2015年12月25日 _x86_64_ (16 CPU)
17時33分23秒 CPU %user %nice %system %iowait %steal %idle
17時33分24秒 all 0.06 0.00 0.19 0.00 0.00 99.75
17時33分24秒 0 0.00 0.00 0.99 0.00 0.00 99.01
17時33分24秒 1 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 2 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 3 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 4 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 5 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 6 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 7 0.00 0.00 3.00 0.00 0.00 97.00
17時33分24秒 8 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 9 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 10 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 11 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 12 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 13 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 14 0.00 0.00 0.00 0.00 0.00 100.00
17時33分24秒 15 0.00 0.00 0.00 0.00 0.00 100.00
平均値: CPU %user %nice %system %iowait %steal %idle
平均値: all 0.06 0.00 0.19 0.00 0.00 99.75
平均値: 0 0.00 0.00 0.99 0.00 0.00 99.01
平均値: 1 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 2 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 3 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 4 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 5 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 6 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 7 0.00 0.00 3.00 0.00 0.00 97.00
平均値: 8 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 9 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 10 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 11 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 12 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 13 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 14 0.00 0.00 0.00 0.00 0.00 100.00
平均値: 15 0.00 0.00 0.00 0.00 0.00 100.00
CPU負荷で着目するのは%user
と%system
%user
値が高い場合
ユーザプロセスがCPUを使用している状態で、基本的にI/O等にボトルネックはない
主な原因としては以下
- プロセスがCPUパワーを必要とする処理をしている
- プロセスが暴走して大量にCPUを消費している
%system
値が高い場合
カーネル空間の処理にCPUを消費している状態
主な原因としては以下
- I/O負荷でCPUを消費している
- 大きいプロセスを高頻度で
fork
(プロセスのコピーを生成)している
CPU負荷が高い時の具体的な対応
- CPU使用率の高い該当プロセスを暫定的に停止する
- 恒久的にはその処理のアルゴリズムやスケジューリングを見直す
- CPUを性能の良いものにする
メモリ
メモリとは
こちらをご確認くあだしあ!
メモリ使用率を確認できるコマンド
プロセスのメモリ使用量を見る
free
sar -r
各プロセスのメモリ使用状況を確認
top
free
[root@centos6]# free
total used free shared buffers cached
Mem: 1922252 1395776 526476 15592 131696 977832
-/+ buffers/cache: 286248 1636004
Swap: 1675260 0 1675260
sar -r
時間推移と共にメモリがどの程度使用されているか確認できる
[root@centos6]# sar -r 1 10
Linux 2.6.32-573.12.1.el6.x86_64 (centos6.jp) 2016年01月08日 _x86_64_ (1 CPU)
13時08分33秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
13時08分34秒 504460 1417792 73.76 131752 978044 1893420 52.63
13時08分35秒 525692 1396560 72.65 131752 978076 1870264 51.99
13時08分36秒 525660 1396592 72.65 131752 978080 1870264 51.99
13時08分37秒 520396 1401856 72.93 131752 978080 1870264 51.99
13時08分38秒 525084 1397168 72.68 131756 978080 1874176 52.10
13時08分39秒 525544 1396708 72.66 131756 978080 1870264 51.99
13時08分40秒 525544 1396708 72.66 131756 978080 1870264 51.99
13時08分41秒 525528 1396724 72.66 131756 978084 1870264 51.99
13時08分42秒 525736 1396516 72.65 131756 978084 1870264 51.99
13時08分43秒 525544 1396708 72.66 131760 978088 1870264 51.99
平均値: 522919 1399333 72.80 131755 978078 1872971 52.06
項目 | 意味 |
---|---|
kbmemfree | 物理メモリの空き容量 |
kbmemused | 使用中のメモリの容量 |
%memused | 物理メモリ使用率 |
kbbuffers | バッファとして使用されている物理メモリの使用率 |
kbcached | キャッシュとして使用されている物理メモリの使用率 |
kbswpfree | スワップ領域の空き容量 |
kbswpused | 使用中のスワップ領域の容量 |
%swpused | スワップ使用率 |
kbswpcad | キャッシュされたswap領域の容量 |
メモリ使用率が高い時の具体的な対応
- 暫定策としてはメモリを占有している該当プロセスを終了させる
- 恒久策としてはプログラムのメモリ使用率の改善またはメモリの増設を行う
スワップ発生の流れ
- プロセスのメモリ使用量が増えると、キャッシュにメモリが使えなくなる
- スワップ領域が使用されディスクI/Oが増加する
- I/Owaitとなるプロセスが増える
- 処理が遅くなる
スワップの発生状況の確認
スワップが多発するとサーバのスループットが低下する
sar -W
sar -r
と組み合わせることでスワップが発生した時間帯に、どの程度メモリが使用されていたか確認できる
[root@centos6 ]# sar -W 1 10
Linux 2.6.32-573.12.1.el6.x86_64 (centos6.jp) 2016年01月08日 _x86_64_ (1 CPU)
23時30分00秒 pswpin/s pswpout/s
23時30分01秒 0.00 0.00
23時30分02秒 64.79 0.00
23時30分03秒 0.00 4613.51
23時30分04秒 8.42 5708.42
23時30分05秒 0.00 4497.80
23時30分06秒 0.00 4522.73
23時30分07秒 0.00 3886.32
23時30分08秒 0.00 5215.00
23時30分09秒 55.17 5801.15
23時30分10秒 0.00 3634.83
平均値: 34.17 4491.55
ディスクI/O
ディスクI/Oとは
ハードディスクなどの外部記憶装置に対するデータの読み書きのことですね!
-
シーケンシャルアクセス(シーケンシャルリード/シーケンシャルライト)
記憶媒体の中で連続した領域に読み書き -
ランダムアクセス(ランダムリード/ランダムライト)
飛び飛びの領域に読み書き
ディスクI/Oを確認できるコマンド
dstat
sar -b
[root@centos6 ~]# sar -b 1 10
Linux 2.6.32-573.12.1.el6.x86_64 (centos6.jp) 2016年01月08日 _x86_64_ (1 CPU)
13時50分19秒 tps rtps wtps bread/s bwrtn/s
13時50分20秒 0.00 0.00 0.00 0.00 0.00
13時50分21秒 12.00 0.00 12.00 0.00 128.00
13時50分22秒 2.00 0.00 2.00 0.00 16.00
13時50分23秒 0.00 0.00 0.00 0.00 0.00
13時50分24秒 0.00 0.00 0.00 0.00 0.00
13時50分25秒 48.00 2.00 46.00 16.00 416.00
13時50分26秒 20028.71 0.00 20028.71 0.00 317734.65
13時50分27秒 34.34 0.00 34.34 0.00 290.91
13時50分28秒 3.96 0.00 3.96 0.00 31.68
13時50分29秒 0.00 0.00 0.00 0.00 0.00
平均値: 2032.90 0.20 2032.70 1.60 32179.20
項目 | 意味 |
---|---|
tps | 物理デバイスへの1秒間のI/Oリクエストの転送量 |
rtps | 物理デバイスへの1秒間の読み込みリクエストの転送量 |
wtps | 物理デバイスへの1秒間の書き込みリクエストの転送量 |
bread/s | 1秒間に読み出されたデータ量(ブロック単位) |
bwrtn/s | 1秒間に書き込まれたデータ量(ブロック単位) |
top
、sar
コマンドで%iowait
が高い場合
CPUの%iowait
が高い場合、まずメモリ、スワップの状態を確認する
-
CPU使用率とは
%user
と%system
の合計値を指し、%iowait
が高い状態であっても、CPUを必要とするプロセスが他にある場合、そのプロセスはCPUを使用可能 -
I/O負荷とは
**CPUがアイドル状態(待機状態)**で、OS上に未処理のディスク入出力(読み書き)要求があった時間の割合を意味する -
つまり
システムの応答が遅いなどの時に、
CPU使用率の%iowait
が%user
や%system
に比べて高い状態である場合、
CPUを使用する処理が大きくないのにディスクへの読み書き要求が発生していることになり、
ディスクI/Oがボトルネックになっている可能性がある
これは、求められるI/O要求に対して、ディスクの処理速度が追いついていない状態になり、
以下のことが考えられる
- アプリケーション自体がディスクにアクセスする速度が遅い
- メモリが不足していてスワップ領域へのアクセスが頻発していて遅い
具体的な対策
- 該当プログラムの修正を行い、ディスクアクセスを減少させる
- ディスクの増設・RAID構成の見直しを行いI/Oの分散を実施する
- SSDなどの高速なディスクを利用する
参考
こちらを主に参考にさせて頂きました!