Linuxサーバ運用マニュアル

第6話「リソースをチェックしよう!」

サーバ運用について,リソースのチェックは重要です。マシンそのものがトラブルをかかえていては,どんな優秀なアプリケーションも役にははたちません。また,運用していく上でマシンのスペックが不足しているなら,対応する必要がありますし,普段からチェックしていれば,マシンの異常を早期発見することもできます。

ここでは,サーバマシンの何をチェックするべきなのか,また,それにはどのようなコマンドを用いるのかを紹介していきます。

CPUのチェック

CPUはコンピューターの心臓部であり,性能に関係するため,重要なチェック対象です。CPUそのものと,プロセスの状態についてチェックします。チェックしたいのは次の項目です。

CPU使用率
CPUがどれだけ使われているかを%で表わしたものです。IDLE(待機)の値をチェックします。
IDLE(待機)の値が低いとパフォーマンスが低下します。継続的にIDLEの値が低い場合はトラブルの可能性があります。
プロセス数
サーバ上で動作しているプロセスの総数です。
実行できるプロセス数には限界があるため,それを超えると障害が発生します。
待ちプロセス数
何らかの理由で待たされているプロセス数です。
待ちプロセスの数が多い場合は,何らかのトラブルの可能性があります。
NICE(優先度)
プロセスの優先度を設定するNICE値です。通常の値は0で,異常な設定をされていないかチェックします。
プロセスの優先度を勝手に変更されると,パフォーマンスが低下する可能性があります。

プロセスの状態遷移について

プロセスとは,実行中のプログラム毎に割り当てられる,CPUの処理単位です。Linuxでは,TSS(Time Sharing System)といって,一定時間毎にプロセスを切り替え,同時に複数のプロセスを動作させることができます。この時,プロセスの状態は,実行状態と待機状態が切り替わります。このプロセスの状態遷移は以下の図のようになります。

プロセスの状態遷移図

プロセスの状態は,実行中に入出力システムコールが発行されるとI/O待ち状態になり,入出力処理が完了すると待機状態になります。また,実行中にスリープ・システムコールが発行されるとスリープ状態になり,起きると待機状態になります。この他,正しく終了処理が行なわれない場合,ゾンビプロセス状態となり,リソースを使用してしまいます。ゾンビプロセスは,init(PID=1)が親となっています。

vmstat(Virtual Memory STATistics)コマンド

vmstatはメモリやCPUの使用状況など,さまざまな状態を表示するコマンドです。 CPUの状態を調べるときは,以下のコマンドを使用します。

Linux> vmstat 5 2

これは,5秒間隔で2回チェックするという意味で,その2回目のデータを利用します。vmstatそのものがCPUを使用するため,間隔をあけて2回チェックしなければ有効なデータが得られないためです。

使用例
Linux> vmstat 5 2
 procs                  memory    swap        io    system         cpu
 r b w  swpd  free  buff cache  si  so   bi   bo   in   cs  us  sy  id
 0 0 0     0  2892  8004  8264   0   0    3    3  125   31   0   4  96
 0 0 0     0  3236  8004  8264   0   0    0    0  130   19   0   0  99

CPUの使用率(%)はcpu(us sy id)に表示されています。idがIDLEの値となっており,ここが低すぎないかチェックします。

また,待ちプロセス数はprocs(r b w)に表示されています。この値が0以外の場合には,待ちプロセスがあることになります。r が大きい場合はCPUの負荷が高く,b が大きい場合はディスクの負荷が高くなっています。

ps(Process Status)コマンド

現在動作中のプロセスを表示するコマンドです。 システムのチェックなどの場合,以下のオプションをつけて実行することになります。

使用例
Linux> ps aux
USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
bin        140  0.0  0.6   848   184  ?  S  May  5   0:00 /usr/sbin/rpc.portmap
hasimoto  4836  0.0  2.1  1236   652  p2 S   14:25   0:00 -jtcsh
hasimoto  4899  0.0  1.2   884   368  p2 R   14:34   0:00 ps aux
root         1  0.0  0.7   848   224  ?  S  May  5   0:22 init [3]
root         2  0.0  0.0     0     0  ?  SW May  5   0:00 (kflushd)
root         3  0.0  0.0     0     0  ?  SW May  5   0:02 (kswapd)
〜以下,全プロセスを表示〜

Linux> ps alx
 FLAGS   UID   PID  PPID PRI  NI   SIZE   RSS WCHAN       STA TTY TIME COMMAND
   100     0     1     0   0   0    848   224 wake_up     S   ?   0:22 init [3]
    40     0     2     1   0   0      0     0 remove_vfsm SW  ?   0:00 (kflushd)
    40     0     3     1 -12 -12      0     0 swap_tick   SW  ?   0:02 (kswapd)
   140     0    13     1   0   0    824   124 sigsuspend  S   ?   0:57 /sbin/update
   140     0    14     1   0   0    840   212 msgctl      S   ?   0:00 /sbin/kerneld
100140     0   137     1   0   0   1104   452 syslog      S   ?   0:00 /usr/sbin/klogd
〜以下,全プロセスを表示〜

このコマンドでプロセス数が確認できるほか,各プロセスごとのCPU使用率や,各プロセスのNICE値をチェックすることができます。CPU使用率はauxオプション時の%CPU,NICE値はalxオプション時のNIに表示されます。

またプロセスの状態は,STATの1文字目に表示され,それぞれ以下の状態を示しています。

この中で,待機状態(T)とI/Oデバイス待ち状態(D)が,待ち状態であり,常に多い場合は負荷が高いと推測できます。待機状態(T)が多い場合はCPUの負荷が高く,I/Oデバイス待ち状態(D)が多い場合はI/Oの負荷が高いと推測できます。また,ゾンビ・プロセスとは,正しく終了処理が行なわれていないプロセスですので,一般的には存在しないものです。

メモリのチェック

メモリも,マシンの動作には重要な要素です。あらゆるプロセスはメモリを消費します。メモリ関連でチェックしたい点は以下の通りです。

空きメモリ量
使用されてないメモリの量です。
空きメモリが不足していると,ハードディスクにスワップが発生してパフォーマンスが低下します。
SWAPの使用量
SWAP(仮想メモリ)がどれだけ使われているかです。
SWAPが使われているとパフォーマンスが低下しますし,SWAPの使用量が限界を超えると完全にメモリ不足となり,障害が発生します。
また,SWAPがいつも使用されているなら,メモリの増設で性能向上が期待できます。
共有メモリ,バッファ・メモリ,キャッシュ・メモリ
共有メモリ,バッファ・メモリ,キャッシュ・メモリの値です。
共有メモリは各プロセスで共通のメモリ,バッファ・メモリは各プロセスに割当られるメモリ,キャッシュ・メモリは高速化のために使用されるメモリです。
これらは普段からチェックしておきます。不自然に大きくなっている場合などは,トラブルの可能性があります。
メモリ配置図

vmstat(Virtyual Memory STATistics)コマンド

vmstatはメモリのチェックにも有効なコマンドです。

使用例
Linux> vmstat
 procs                  memory    swap        io    system         cpu
 r b w  swpd  free  buff cache  si  so   bi   bo   in   cs  us  sy  id
 0 0 0     0  2480  8004  8264   0   0    3    3  125   31   0   4  96

現在使用中のSWAPの量はmemory(swpd)に表示され,メモリの空き容量はmemory(free)に表示されますので,そこをチェックします。

freeコマンド

freeは,物理メモリ,仮想メモリの使用状況を表示するコマンドです。メモリについての詳細情報を知ることができます。メモリをどういう目的で利用しているかがわかります。

使用例
Linux> free
             total       used       free     shared    buffers     cached
Mem:         29888      27844       2044      20068       8580       8264
-/+ buffers/cache:      11000      18888
Swap:            0          0          0

sharedは共有メモリ,buffersはバッファ・メモリ,cachedはキャッシュ・メモリの値をそれぞれ示します。また,freeに空き容量,Swap行にSWAPの状況も表示しています。

ps(Process Status)コマンド

各プロセスがどれだけのメモリを消費しているかをチェックするには,psコマンドを,auxオプションで使います。

使用例
Linux> ps aux
USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
bin        140  0.0  0.6   848   184  ?  S  May  5   0:00 /usr/sbin/rpc.portmap
hasimoto  4836  0.0  2.1  1236   652  p2 S   14:25   0:00 -jtcsh
hasimoto  4899  0.0  1.2   884   368  p2 R   14:34   0:00 ps aux
root         1  0.0  0.7   848   224  ?  S  May  5   0:22 init [3]
root         2  0.0  0.0     0     0  ?  SW May  5   0:00 (kflushd)
root         3  0.0  0.0     0     0  ?  SW<May  5   0:02 (kswapd)
〜以下,全プロセスを表示〜

各プロセスごとのメモリ使用量は%MEM,SIZE,RSSに表示されます。SIZEはプログラム全体のサイズ,RSSが実際のメモリ使用量,%MEMは,それを割合で記述したものです。

ipcsコマンド

IPCリソース機能についての情報を表示するコマンドです。共有メモリなどのチェックに利用します。普段,共有メモリを使わない場合は,あまり使用しません。

使用例
Linux> ipcs
------ Shared Memory Segments --------
key        shmid     owner     perms     bytes     nattch    status
0x00000000 0         wmaster   600       52228     8         dest

------ Semaphore Arrays --------
key       semid     owner     perms     nsems     status

------ Message Queues --------
key       msqid     owner     perms     used-bytes  messages
0x00000000 0         root      700       0           0

ハードディスクのチェック

データというものは増えることはあっても,基本的に減ることはありません。つまり,放置するとディスク残量はどんどん減っていくことになります。チェックして,対応していかなければなりません。チェックしたい項目は次の通りです。

パーティションの使用量
パーティションごとの使用量です。空き容量をチェックします。
残り容量がなくなるとファイルの新規作成や更新ができなくなり,障害が発生します。
ファイル数(i-node)
パーティションごとのファイル数(i-node)です。
作成できるファイル数には限界がありますので,限界になるとファイルの新規作成ができなくなり,障害が発生します。
ニュースサーバのように,細かいファイルをたくさん作成するような場合には,注意が必要です。
ディレクトリの使用量
ディレクトリ単位でのハードディスク使用量です。
ディレクリの使用量に制限はありませんが,大きすぎる場合には,パーテションの使用量を圧迫することになります。
ユーザー毎の使用量(quota)
quotaで制限されている,各ユーザーごとハードディスク使用量です。
設定値を超えると,そのユーザーがファイルを作れなくなります。
ディスク配置図

df(Disk Free)コマンド

ハードディスクのパーテション情報などを表示するコマンドです。マウントされたディスクの残り用量などを表示します。オプションとして,-iを使うことでi-nodeの数を表示することもできます。

使用例
Linux> df
Filesystem         1024-blocks  Used Available Capacity Mounted on
/dev/hda1            3943252 3200754   538475     86%   /
/dev/hdb1            6079051 4520803  1243376     78%   /hdb1

Linux> df -i
Filesystem           Inodes   IUsed   IFree  %IUsed Mounted on
/dev/hda1            1021952   88522  933430     9%  /
/dev/hdb1            1574912   63413 1511499     4%  /hdb1

ディスク容量やファイル数の残りはCapacityと%IUsedに,割合で表示されます。また,パーティションには,リザーブ領域(初期値10%)があり,余裕を持たされています。リザーブ領域は,スーパーユーザーしか書き込みできなくなっています。

du(Disk Usage)コマンド

ディスクの使用状況を表示するコマンドです。指定したディレクトリとそのサブディレクトリの使用状況を,キロバイト単位で表示します。ディレクトリを指定しない場合,カレントディレクトリの状況を表示します。

使用例
Linux> du public_html 

3       ./info
8       ./img
6       ./webprog
3       ./games
3       ./link
43      .

これは,あるユーザーのHTML領域を調べている例です。duコマンドは,詳細なデータを表示しますが。その分だけ負荷が大きいので注意が必要です。

quota

quotaを使用すると,ユーザー領域などユーザー単位で制限することができるため,ディスク・オーバーフローが発生しにくくなります。ユーザー数が多い場合には必須であると言えます。

チェックにはrepquotaコマンドを用います。

使用例
Linux> quotacheck -a

Linux> repquota -a
                        Block limits               File limits
User            used    soft    hard  grace    used  soft  hard  grace
root      --      19       0       0              3     0     0
hasimoto  --       1       0       0              1     0     0
usr01     --       1    5000    5500              1  1000  1200
usr02     --       1    5000    5500              1  1000  1200

quotacheckコマンドで現在の状況を反映させ,repquotaでその状況を表示します。Block limitsは容量の制限,File limitsは,ファイル数の制限になります。 ソフト・リミットを超えてファイルを作ることはできますが,ハード・リミットを超えることは不可能です。

ネットワークのチェック

ネットワークでは,ネットワーク・デバイスの状況をチェックします。ネットワーク全体の負荷監視には専用ソフトが必要でしょう。ここでは,Linuxの標準コマンドでのチェック方法を紹介します。

netstat -i

ネットワークの状態を表示するコマンドnetstatのオプションの1つです。ネットワーク・カードの状態を示します。

使用例
Linux> netstat -i
Kernel Interface table
Iface   MTU Met  RX-OK RX-ERR RX-DRP RX-OVR  TX-OK TX-ERR TX-DRP TX-OVR Flags
lo     3584   0   7876      0      0      0   7876      0      0      0 BLRU
eth0   1500   0  46909      0      0      0  52750      0      0      0 BRU
eth1   1500   0  48389      0      0      0  32405      0      0      0 BRU

転送エラーや,転送もれの数が,ERRやDRPに表示されます。これをチェックしておき,数が増えていないかチェックします。

その他のチェック

これまでに述べてきたもの以外にも,チェックしたい項目は存在します。

ユーザー数
現在ログインしているユーザーの総数です。
ユーザー数が多いとパフォーマンスが低下します。
負荷状態
システムの平均的な負荷状態です。
これが高くなると,パフォーマンスが低下します。高すぎる場合などは,トラブルの可能性があります。
アクセス記録
ユーザーのサーバへのアクセス記録です
不自然なログイン記録などがある場合,不正アクセスの可能性があります。

uptimeコマンド

現在時間,システムの連続可動時間,ログインしているユーザー数,システムの平均負荷を表示します。ユーザー数が多くなると,サーバの増設が必要となります。

使用例
Linux> uptime
  4:32pm  up 14 days, 18:34,  1 user,  load average: 0.10, 0.07, 0.01

whoコマンド

ログイン中のユーザー情報を表示するコマンドです。-iで休止時間を含み,-Hで見出しを表示します。今,誰がログインしているかがわかります。

使用例
Linux> who -iH
USER     LINE     LOGIN-TIME   IDLE  FROM
hasimoto ttyp1    May 17 08:24   .   (pc20.lo.ash.or.j)

lastコマンド

ユーザーのログイン記録を表示するコマンドです。過去の各ユーザーのログイン実績が記録されています。ユーザー毎のログイン回数などの変動をチェックすると,不正アクセスを発見できる場合があります。また,各ユーザーに対して,ログイン実績の確認を取るのも効果的でしょう。

使用例
Linux> last
hasimoto  ttyp0        pc20.lo.ash.or.j Mon May 17 21:17   still logged in
hasimoto  ftp          pc20.lo.ash.or.j Mon May 17 21:07 - 21:09  (00:02)
hasimoto  ttyp0        pc20.lo.ash.or.j Mon May 17 20:29 - 20:54  (00:25)
yanagi    ttyp0        pc23.lo.ash.or.j Mon May 17 20:01 - 20:29  (00:27)
joe       ftp          pc23.lo.ash.or.j Mon May 17 18:52 - 18:59  (00:07)
〜以下,省略〜

wコマンド

uptimeとwhoを組み合わせたようなコマンドで,1行目の出力はuptimeと同じです。どのユーザーが,いつ,どこからログインし,何をしているかを表示します。

使用例
Linux> w

  4:32pm  up 14 days, 18:34,  1 user,  load average: 0.10, 0.07, 0.01
USER     TTY      FROM              LOGIN@  IDLE   JCPU   PCPU  WHAT
hasimoto ttyp0    pc20.lo.ash.or.j 4:25pm  0.00s  0.21s  0.04s  w

topコマンド

最後に,topコマンドについて解説します。このコマンドは実行すると継続して動作し続け,さまざまなデータを出力し続けます。CPUの使用率(IDLE),プロセス数,待ちプロセス数,優先度(NICE),SWAPの使用量,空きメモリ量(バッファ・メモリ,共有メモリ,キャッシュ・メモリ),ユーザー数,負荷状態など,数多くのデータを表示します。

ただし,端末からの対話的な使用を前提として作られているため,cronなどから起動することはできないという問題点があります。

使用例
Linux> top
  9:51pm  up  5:22,  1 user,  load average: 0.01, 0.02, 0.00
45 processes: 43 sleeping, 1 running, 1 zombie, 0 stopped
CPU states:  0.0% user,  3.8% system,  0.0% nice, 96.2% idle
Mem:   29888K av,  27384K used,   2504K free,  17716K shrd,  12204K buff
Swap:      0K av,      0K used,      0K free                  4276K cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT  LIB %CPU %MEM   TIME COMMAND
19521 hasimoto  15   0   480  480   368 R       0  1.7  1.5   0:01 top
    1 root       0   0   184  132   112 S       0  0.0  0.4   0:46 init
    2 root       0   0     0    0     0 SW      0  0.0  0.0   0:03 kflushd
    3 root     -12 -12     0    0     0 SW<     0  0.0  0.0   0:03 kswapd
  129 root       0   0   120   60    60 S       0  0.0  0.1   0:00 agetty
   14 root       0   0   140   88    72 S       0  0.0  0.2   0:00 kerneld
   70 root       0   0   240  188   148 S       0  0.0  0.6  19:11 syslogd

次回予告

サーバは,さまざまな情報をログとして出力してくれています。サーバを運用していくためには,ログをチェックすることが不可欠です。

と,いうわけで次回は「ログをチェックしよう!」です。

(ASHマルチメディア研究会/joe,はしもと)