■リソース管理
Linuxサーバを運用していて何か調子が悪い、といったときには原因を調査する必要があります。そういった際に役立つコマンド群の覚書です。
まずは定番のtopコマンドです。CPU、メモリー、プロセスの状態を確認できます。「< >」を押せばシステムリソースをソートして表示できます。表示される項目の中にload averageという項目がありますが、これがひとつのCPU負荷の目安になります。負荷の少ないサーバであれば1以下の少数が表示されていると思いますが、値が1になると処理待ちのプロセスが発生しており負荷が高い状態ということになります。10ともなれば異常事態とも言えますがクアッドコアなどのCPUを積んでいる場合はコア数で割り算を行った値が正と思って良いようです。
# top
top - 02:42:21 up 2 min, 2 users, load average: 1.25, 0.63, 0.24
Tasks: 138 total, 1 running, 137 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.7%us, 0.7%sy, 0.0%ni, 96.2%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 1012704k total, 462944k used, 549760k free, 23264k buffers
Swap: 2031608k total, 0k used, 2031608k free, 178552k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2204 root 20 0 163m 28m 6756 S 2.7 2.9 0:03.39 Xorg
2634 toshi 20 0 283m 12m 9368 S 0.7 1.3 0:00.50 gnome-terminal
7 root 20 0 0 0 0 S 0.3 0.0 0:00.16 events/0
255 root 20 0 0 0 0 S 0.3 0.0 0:00.06 scsi_eh_1
2513 toshi 20 0 519m 20m 13m S 0.3 2.0 0:00.89 nautilus
1 root 20 0 19352 1564 1252 S 0.0 0.2 0:01.76 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.00 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 sync_supers
|
Cpu(s)のところに表示されているアルファベット2文字は以下の意味です。
| 項目 | 説明 |
| us | ユーザプロセスの割合 |
| sy | システムプロセスの割合 |
| ni | 優先度を変更した ( nice ) ユーザプロセスの割合 |
| id | アイドル状態の割合 |
| wa | IO終了待ち状態の割合 |
| hi | ハードウェア割り込み要求の割合 |
| si | ソフトウェア割り込み要求の割合 |
| st | 仮想化環境で他のOSに消費された割合 |
「vmstat」コマンドは仮想メモリーの統計情報を表示するコマンドです。メモリの他、CPUやデバイスの割り込みの状況も確認可能です。Linuxが重いと感じたときはvmstatを使えば原因がCPUを使い切っているのかメモリなのかデバイスの転送周りでI/Oを使い切っているのかなどの切り分けの手助けとなります。
以下のように実行すると容量をメガ単位で10秒間隔で3回状態を取得できます。
# vmstat -S M 5 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 402 23 303 0 0 759 141 195 1225 4 7 82 8 0 0 0 0 402 23 303 0 0 0 12 59 144 1 1 98 1 0 0 0 0 402 23 303 0 0 0 0 40 68 0 0 100 0 0 |
CPUの項目に関してはtopと同様です。その他の項目の意味について以下にまとめます。
| memory | |
| swpd | スワップ領域の使用量。 |
| free | 空きメモリの容量。重い処理をしているわけでもないのに 大きくなっていることがありますが問題ありません。 |
| buff | カーネルがバッファとして使用している容量。 |
| cache | ディスクのキャッシュとして保存しているメモリ容量。 値が大きくなることがありますが未使用と同義で空きメモリが もったいないのでキャッシュとして利用していることが一般的です。 |
| swap | |
| si | スワップ領域から読み込んでメモリに展開した容量 |
| so | スワップ領域に書き込んだデータの容量 |
| io | |
| bi | ブロックデバイスから読み込んだ容量 |
| bo | ブロックデバイスに書き込んだ容量 |
| system | |
| in | 割り込み処理の回数 |
| cs | コンテクストスイッチの回数 |
「free」コマンドはシステム上の空きメモリと使用中のメモリを表示するコマンドです。メモリの使用量は上述のtopやvmstatで確認できますがfreeコマンドを使えばメモリのみの空き容量を詳細に確認できます。-mオプションをつければ容量をメガ単位で表示できます。
# free -m
total used free shared buffers cached
Mem: 988 790 198 0 28 466
-/+ buffers/cache: 296 692
Swap: 1983 0 1983
|
定期的に実行する「watch」コマンドとfreeコマンドを組み合わせればメモリの空き容量をモニタリングできます。watchコマンドはデフォルトでは2秒間隔でwatchコマンドの次に指定したコマンドを実行します。-nオプションをつければ指定した秒間隔で実行出来ます。
# watch -n 5 free -m
Every 5.0s: free -m Tue Jul 2 03:52:47 2013
total used free shared buffers cached
Mem: 988 789 199 0 28 466
-/+ buffers/cache: 294 694
Swap: 1983 0 1983
|
「iotop」コマンドはtopコマンドライクなI/Oモニターです。プロセス、スレッドごとにI/O使用状況を表示できます。プロセスのうちどのプロセスが原因でディスクの負荷が高まっているのかを確認できます。システムのボトルネックの分析に役立ちます。これは標準ではインストールされていないことが多いのでyumからインストール後にコマンドを実行します。
# yum install iotop
# iotop
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
5 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
7 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [events/0]
8 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [cgroup]
9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khelper]
10 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [netns]
11 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [async/mgr]
12 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [pm]
13 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [sync_supers]
14 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bdi-default]
|
「iostat」コマンドはディスクIOの統計情報を取得できるコマンドです。パラメータとして時間や回数を入力しない場合は現在のディスクIOの統計情報を1回出力します。サーバの運用においてストレージの負荷状況を監視するのは極めて重要です。Linuxでストレージの負荷状況を調べるには様々なコマンドがありますがiostatコマンドはCPUの使用状況とストレージIOの状態が確認できるのでおすすめです。-mオプションでメガ表記にできます。
# iostat -m
Linux 2.6.32-279.el6.x86_64 (localhost.localdomain) 07/02/2013 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.49 0.10 1.22 0.95 0.00 97.24
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 2.89 0.05 0.03 436 216
|
出力の意味は以下の通りです。
| 項目 | 説明 |
| tps | 1秒間のIOリクエスト数 |
| Blk_read/s | 1秒間の読み込みブロック容量 |
| Blk_wrtn/s | 1秒間の書き込みブロック容量 |
| Blk_read | ディスクの読み込みブロック容量 |
| Blk_wrtn | ディスクの書き込みブロック容量 |
-xオプションをつけることでさらに詳細なデータを取得することができます。
# iostat -mx
Linux 2.6.32-279.el6.x86_64 (localhost.localdomain) 07/02/2013 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.48 0.10 1.19 0.91 0.00 97.32
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.58 6.00 2.12 0.67 0.05 0.03 57.56 0.08 29.37 4.69 1.31
|
各項目の意味は下記の通りです。
| 項目 | 説明 |
| rrqm/s | 1秒間のデバイスへマージされた読み込みリクエスト数 |
| wrqm/s | 1秒間のデバイスへマージされた書き込みリクエスト数 |
| r/s | 1秒間の読み込みリクエスト数 |
| w/s | 1秒間の書き込みリクエスト数 |
| rMB/s | 1秒間の読み込みメガバイト数 |
| wMB/s | 1秒間の書き込みメガバイト数 |
| avgrq-sz | IOリクエストの平均IOサイズ |
| avgqu-sz | IOリクエストの平均キューサイズ |
| await | IOリクエストの平均待ち時間 |
| svctm | IOリクエストの平均処理時間 |
| %util | IOリクエストのCPU使用率 |
「sar ( System Admin Reporter )」コマンドはCPUやネットワーク、メモリー、ディスクなどの情報を出力できるコマンドです。前述したコマンドと違いこのコマンドは過去に遡って出力することが可能です。主要なオプションとして以下があります。
| 項目 | 説明 |
| -A | 全ての監視結果を出力する |
| -u | CPUの利用状況 |
| -r | メモリー利用率の状態 |
| -R | メモリーの状況 |
| -S | スワップ領域の利用状況 |
| -W | スワップの状態 |
| -b | ディスクIOと転送率の状況 |
| -s | 指定した時間のパフォーマンスデータを出力 ( 初期設定必要 ) |
sarコマンドはsysstatパッケージに含まれます。インストールされていない場合はまずこれをインストールします。以下、使用例です。
# yum install sysstat # rpm -qa | grep sysstat sysstat-9.0.4-20.el6.x86_64 # CPUの状態を3秒間隔で3回取得する # sar -u 3 3 Linux 2.6.32-279.el6.x86_64 (localhost.localdomain) 07/02/2013 _x86_64_ (1 CPU) 05:24:40 AM CPU %user %nice %system %iowait %steal %idle 05:24:43 AM all 2.39 0.00 1.71 11.26 0.00 84.64 05:24:46 AM all 1.02 0.00 0.68 0.00 0.00 98.30 05:24:49 AM all 3.86 0.00 2.11 3.86 0.00 90.18 Average: all 2.41 0.00 1.49 5.05 0.00 91.06 # メモリ利用率を3秒間隔で3回取得する # sar -r 3 3 Linux 2.6.32-279.el6.x86_64 (localhost.localdomain) 07/02/2013 _x86_64_ (1 CPU) 05:25:30 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit 05:25:33 AM 218752 793952 78.40 34528 446336 573580 18.84 05:25:36 AM 218752 793952 78.40 34536 446336 573580 18.84 05:25:39 AM 218500 794204 78.42 34536 446336 573580 18.84 Average: 218668 794036 78.41 34533 446336 573580 18.84 # 0:00頃から現在までのCPU利用率を表示 # sar -u -s 00:00:00 Linux 2.6.32-279.el6.x86_64 (localhost.localdomain) 07/02/2013 _x86_64_ (1 CPU) 02:40:32 AM LINUX RESTART 02:50:01 AM CPU %user %nice %system %iowait %steal %idle 03:00:01 AM all 0.72 0.00 0.62 0.60 0.00 98.07 03:10:01 AM all 0.40 0.00 0.86 0.14 0.00 98.61 03:20:01 AM all 0.03 1.37 4.20 4.61 0.00 89.79 03:30:01 AM all 0.04 0.01 0.55 0.78 0.00 98.61 03:40:01 AM all 0.05 0.00 0.40 0.03 0.00 99.53 03:50:01 AM all 0.05 0.00 0.41 0.03 0.00 99.52 04:00:01 AM all 0.53 0.00 0.55 0.06 0.00 98.85 04:10:01 AM all 0.08 0.00 0.48 0.05 0.00 99.39 04:20:01 AM all 0.08 0.00 0.49 0.02 0.00 99.41 04:30:01 AM all 0.07 0.00 0.48 0.02 0.00 99.43 04:40:01 AM all 0.08 0.00 0.47 0.07 0.00 99.39 04:50:01 AM all 1.44 0.00 1.42 0.46 0.00 96.68 05:00:01 AM all 0.14 0.00 0.41 0.02 0.00 99.43 05:10:01 AM all 0.39 0.00 0.48 0.05 0.00 99.08 05:20:01 AM all 0.05 0.00 0.38 0.21 0.00 99.37 Average: all 0.28 0.09 0.81 0.48 0.00 98.34 |
これらの過去の性能データは「/var/log/sa/sa**」というファイル名で保存されます。例えば19日のデータから23:30から23:55までの性能データを確認するには以下のようにコマンドを入力します。
# sar -u -f /var/log/sa/sa19 -s 23:30:00 -e 23:55:00 |