Linuxサーバ運用マニュアル
サーバ運用について,リソースのチェックは重要です。マシンそのものがトラブルをかかえていては,どんな優秀なアプリケーションも役にははたちません。また,運用していく上でマシンのスペックが不足しているなら,対応する必要がありますし,普段からチェックしていれば,マシンの異常を早期発見することもできます。
ここでは,サーバマシンの何をチェックするべきなのか,また,それにはどのようなコマンドを用いるのかを紹介していきます。
CPUはコンピューターの心臓部であり,性能に関係するため,重要なチェック対象です。CPUそのものと,プロセスの状態についてチェックします。チェックしたいのは次の項目です。
プロセスとは,実行中のプログラム毎に割り当てられる,CPUの処理単位です。Linuxでは,TSS(Time Sharing System)といって,一定時間毎にプロセスを切り替え,同時に複数のプロセスを動作させることができます。この時,プロセスの状態は,実行状態と待機状態が切り替わります。このプロセスの状態遷移は以下の図のようになります。
プロセスの状態は,実行中に入出力システムコールが発行されるとI/O待ち状態になり,入出力処理が完了すると待機状態になります。また,実行中にスリープ・システムコールが発行されるとスリープ状態になり,起きると待機状態になります。この他,正しく終了処理が行なわれない場合,ゾンビプロセス状態となり,リソースを使用してしまいます。ゾンビプロセスは,init(PID=1)が親となっています。
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 が大きい場合はディスクの負荷が高くなっています。
現在動作中のプロセスを表示するコマンドです。 システムのチェックなどの場合,以下のオプションをつけて実行することになります。
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の負荷が高いと推測できます。また,ゾンビ・プロセスとは,正しく終了処理が行なわれていないプロセスですので,一般的には存在しないものです。
メモリも,マシンの動作には重要な要素です。あらゆるプロセスはメモリを消費します。メモリ関連でチェックしたい点は以下の通りです。
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は,物理メモリ,仮想メモリの使用状況を表示するコマンドです。メモリについての詳細情報を知ることができます。メモリをどういう目的で利用しているかがわかります。
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コマンドを,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は,それを割合で記述したものです。
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を使うことで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%)があり,余裕を持たされています。リザーブ領域は,スーパーユーザーしか書き込みできなくなっています。
ディスクの使用状況を表示するコマンドです。指定したディレクトリとそのサブディレクトリの使用状況を,キロバイト単位で表示します。ディレクトリを指定しない場合,カレントディレクトリの状況を表示します。
Linux> du public_html 3 ./info 8 ./img 6 ./webprog 3 ./games 3 ./link 43 . |
これは,あるユーザーのHTML領域を調べている例です。duコマンドは,詳細なデータを表示しますが。その分だけ負荷が大きいので注意が必要です。
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のオプションの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に表示されます。これをチェックしておき,数が増えていないかチェックします。
これまでに述べてきたもの以外にも,チェックしたい項目は存在します。
現在時間,システムの連続可動時間,ログインしているユーザー数,システムの平均負荷を表示します。ユーザー数が多くなると,サーバの増設が必要となります。
Linux> uptime 4:32pm up 14 days, 18:34, 1 user, load average: 0.10, 0.07, 0.01 |
ログイン中のユーザー情報を表示するコマンドです。-iで休止時間を含み,-Hで見出しを表示します。今,誰がログインしているかがわかります。
Linux> who -iH USER LINE LOGIN-TIME IDLE FROM hasimoto ttyp1 May 17 08:24 . (pc20.lo.ash.or.j) |
ユーザーのログイン記録を表示するコマンドです。過去の各ユーザーのログイン実績が記録されています。ユーザー毎のログイン回数などの変動をチェックすると,不正アクセスを発見できる場合があります。また,各ユーザーに対して,ログイン実績の確認を取るのも効果的でしょう。
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) 〜以下,省略〜 |
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コマンドについて解説します。このコマンドは実行すると継続して動作し続け,さまざまなデータを出力し続けます。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,はしもと)