いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.177 / 読者数:1502名

こんばんは、うすだです。

突然ですが、わたしの個人的なサイト(usupi.org)は、 レンタルサーバ上に構築されています。

といっても、まるっとサーバを借りるほどの財力はありませんので、 格安な VPS(バーチャル・プライベート・サーバ)でしのいでいます。
ただ、ときどき、やけにマシンの負荷が高いときがあります。

バーチャルですから、本物のサーバで複数の仮想マシンが動作していて、 それらが頻繁にお仕事をされているのだろうなどと、 ろくに調べもせずに納得して(というか諦めて)おりました。

ですが、先日、マシンが重いときに topコマンドを実行してみたところ、 sshd がいくつも走行していることに気がつきました。

…はい、どこからでもリモートでログインできるよう、 ssh はウェルカムな設定にしていました。
ですので、遠くの(ひょっとすると近くかも)知らないお友だちが、 不正にログインを試みていたように思われます。

というわけで、大昔にご紹介しました DenyHosts を導入し、 ログインに失敗し続けた相手からの接続をブロックするようにしてみました。

DenyHosts
http://denyhosts.sourceforge.net/

すると、/etc/hosts.deny の sshd のエントリが、 じわじわ増加するようになりました。
そして、ここのところはさほど重たくならず、順調に動作しております。

ただ、ひとつ気がかりなのは、 自分がブロックされたらどうしようという不安を拭い去れないことです。
こういうのを、杞憂というのでしょうか…。

…ああ、損な性格だなぁと思いつつ、今週もはりきってまいりたいです。

今回のお題 - sysstat でシステムの状態を監視する

というわけで、勝手に想像せず、きちんと情報を収集し、 その情報を解析して判断しなければならない、ということを再認識いたしました。
ですので、早期に異常を発見できるよう、 システムの状態を定期的に監視するものをVPSサーバに仕込もうとしております。

ただ、システムの状態を監視する、と簡単に言っていますが、 Linux には監視すべき対象がたくさんあります。
ぱっと思いつくだけでも、CPU やメモリ、ディスク、ネットワークなどがあります。 そして、それらの状態を知るためのコマンドも、たくさんあると思います。 (vmstat, netstat, top, free, swapon などがあります。)

しかし、それらのコマンドを全部実行して解析して…ということを定期的に行うのは、 ややこしいですよね。一括で監視できると楽ちんです。

というわけで今回は、sysstat を使って、 システムの状態をまとめて収集してみたいと思います。

sysstat とは

なにはともあれ、まずは sysstat について、簡単にご紹介します。

sysstat は、Linux のシステムの状態を収集するためのツールです。
最初のバージョンが1999年にリリースされていますので、 それなりに実績のあるツールだと言えると思います。

SYSSTAT
http://pagesperso-orange.fr/sebastien.godard/

収集してくれる情報は、CPU、メモリ、プロセス、割込み、ネットワークや端末など、 非常に幅広いです。

そして、Ubuntu や Fedora には sysstat パッケージが存在しますので、 apt や yum でインストールすれば、すぐに使用することができます。
おそらくインストール時には入らないパッケージだと思いますので、 以下の手順でインストールしてください。

  $ sudo apt-get install sysstat  (Debian系の場合)
  # yum install sysstat           (RedHat系の場合)

まずは情報収集から

ほとんど説明になっていない紹介が終わりましたので、早速使ってみようと思います。

情報を収集するには、sar コマンドを使用します。
情報収集の際に必要な引数は、計測する間隔(単位は秒)と回数です。

  # sar 間隔 回数

すると、/var/log/sysstat/sa もしくは /var/log/sa/sa に 情報収集した結果が記録されます。 (には今日の日付が入ります。)
もし上記のファイルがすでにある場合は、 上書きされて古いデータが消去されてしまう…ということはなく、 どんどん追記されていきます。

お好みのファイルに出力したい場合は、-o オプションを使用します。
たとえば、1秒間隔で5回計測し、結果を /tmp/sar.log に出力したい場合は、 以下のように実行します。

  # sar -o /tmp/sar.log 1 5
  Linux 2.6.31-17-generic (tamao)   04/04/10   _i686_  (2 CPU)

  02:11:18   CPU  %user  %nice  %system  %iowait  %steal    %idle
  02:11:19   all   2.93   0.00     2.44     2.93    0.00    91.71
  02:11:20   all   3.85   0.00     5.29     1.44    0.00    89.42
  02:11:21   all   2.45   0.00     1.96     2.45    0.00    93.14
  02:11:22   all   3.43   0.00     1.96     1.96    0.00    92.65
  02:11:23   all   2.93   0.00     1.95     1.46    0.00    93.66
  Average:   all   3.12   0.00     2.73     2.05    0.00    92.11

実行しますと、ファイルに記録するとともに、 CPU の使用状況を標準出力に出してくれます。

ちなみに、上記を実行したときの出力ファイルのサイズは、 以下のようになっていました。べらぼうに蓄積される、というわけではなさそうです。

  # ls -l /tmp/sar.log
  -rw-r--r-- 1 root root 46140 Apr  4 02:08 /tmp/sar.log

収集したデータを参照しますよ

さて、sar コマンドを使用して定期的に情報を収集したら、 解析するために中身を参照する必要があります。

データの中身を見るには…おっと、これも sar コマンドを使用します。
-f オプションで先ほどの出力ファイルを指定しますと、収集したときと同様に、 CPU の使用状況を出力してくれます。

  # sar -f /tmp/sar.log
  Linux 2.6.31-17-generic (tamao)   04/04/10   _i686_  (2 CPU)

  02:11:18   CPU  %user  %nice  %system  %iowait  %steal    %idle
  02:11:19   all   2.93   0.00     2.44     2.93    0.00    91.71
  02:11:20   all   3.85   0.00     5.29     1.44    0.00    89.42
  ...

ちなみに、%user は(優先度が低くない)ユーザプロセスの走行した割合、 %nice は nice によって優先度を下げたユーザプロセスの走行した割合、 %system はカーネルの走行した割合、 %iowait はI/O待ち状態だったときの割合、 %steal は仮想化環境で他のゲストOSにCPUを明け渡していたときの割合、 %idle はアイドル状態の割合、 となっているようです。
(%steal は、KVMでゲストOSを動かしても 0% でしたので、 実のところはよくわかりません。すみません。)

 

もちろん、収集された情報は CPU に関するものだけではありません。
たとえば、-b オプションを指定しますと、 デバイスに対する I/O の統計情報を出力してくれます。

  # sar -b -f /tmp/sar.log
  Linux 2.6.31-17-generic (tamao)   04/04/10   _i686_  (2 CPU)

  02:11:18          tps      rtps      wtps   bread/s   bwrtn/s
  02:11:19         7.92      0.00      7.92      0.00    142.57
  02:11:20         7.92      0.00      7.92      0.00    102.97
  02:11:21         8.08      0.00      8.08      0.00    113.13
  ...

ちなみに、tps は1秒間にリクエストした回数、 rtpswtps はそのうちの read と write の回数(つまり tps = rtps + wtps です)、 bread/sbwrtn/s は read と write のデータブロック数です。

 

また、-r オプションを指定しますと、メモリの使用量の統計情報を出力してくれます。

  # sar -r -f /tmp/sar.log
  Linux 2.6.31-17-generic (tamao)   04/04/10   _i686_  (2 CPU)

  02:11:18 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
  02:11:19    148512   1838732    92.53     64688  1015076  2114072   43.84
  02:11:20    148016   1839228    92.55     64696  1015384  2114136   43.84
  02:11:21    147644   1839600    92.57     64704  1015904  2114648   43.85
  ...

項目がたくさんありますが、kbmemfree は空きメモリ(kB)、 kbmemused は使用中のメモリ、 %memused は kbmemused/(kbmemused+kbmemfree)*100、 kbbuffers はバッファ、 kbcached はキャッシュ、 kbcommit は事前に必要なため確保(というか予約)しているメモリ、 %commit はその割合です。

 

さらに、ネットワークの統計情報も収集してくれています。
-n オプションで種別(DEV, IP, ICMP, TCP, UDP などがあり、ALL で全部を出力) を指定しますと、それぞれの統計情報を出力します。
たとえば、TCP の統計情報を出力するには、以下のように実行します。

  # sar -n TCP -f /tmp/sar.log
  Linux 2.6.31-17-generic (tamao)   04/04/10   _i686_  (2 CPU)

  02:11:18     active/s passive/s    iseg/s    oseg/s
  02:11:19         0.00      0.00      0.00      0.00
  02:11:20         0.99      0.00      0.99      2.97
  02:11:21         0.00      0.00     20.79     19.80
  02:11:22         0.00      0.00     50.51     50.51
  ...

ちなみに、active/s は1秒間にこちらからオープンした数、 passive/s はオープンされた数、 iseg/s は受信したセグメント数、 oseg/s は送信したセグメント数です。

 

それから、時間を指定して範囲を限定することもできます。
-s オプションで開始時間、-e オプションで終了時間を指定できます。
たとえば、02:11:20 から 02:11:22 までの情報だけを知りたい場合は、 以下のように実行します。

  # sar -n TCP -s 02:11:20 -e 02:11:22 -f /tmp/sar.log
  Linux 2.6.31-17-generic (tamao)   04/04/10   _i686_  (2 CPU)

  02:11:20     active/s passive/s    iseg/s    oseg/s
  02:11:21         0.00      0.00      0.00      0.00
  02:11:22         0.00      0.00      0.00      0.00
  Average:         0.00      0.00      0.00      0.00

上記は TCP の場合の例ですが、すべてのオプションと併用できます。

 

…やや駆け足でご紹介しましたが、他にも、-B でページング、-m でCPUクロック、 -q でキュー、-S でスワップなど、たくさんオプションが存在します。 詳しくはオンラインマニュアル(man sar)をご覧ください。

gnuplot でグラフ化しましょう

以上で、システムの状態をファイルに記録し、参照することができるようになりました。

ただ、数字の羅列を見ていても、ぱっとわかるものではないですよね。
ここはひとつ、グラフにして、ぱっと判断できるようにしてみましょう。

グラフの作成には、ここでは gnuplot を使用します。
こちらも、Ubuntu や Fedora などにパッケージがありますので、 apt や yum などでインストールしておいてください。

そして、グラフにする対象は、CPU の使用状況にしたいと思います。
ただ、sar コマンドの出力そのままでは使いづらいですので、前もって、 データが含まれる行だけに加工しておきます。

  $ sar -f /var/log/sysstat/sa04 | grep '^[0-9].*all' > cpu.dat
  $ cat cpu.dat
  00:05:01  all  1.43  0.00  0.67  0.06  0.00  0.00  0.00  0.00  97.84
  00:15:01  all  1.78  0.00  1.43  0.07  0.00  0.01  0.01  0.00  96.71
  00:25:01  all  1.89  0.00  1.54  0.07  0.00  0.01  0.00  0.00  96.49
  ...

上記では、変換した結果を、cpu.dat というファイルに出力しています。

そして、gnuplot のコマンドを記述したファイルを用意します。
その内容は、以下のようにしてみました。

set xdata time
set timefmt "%H:%M:%S"
plot "cpu.dat" using 1:3 title "user" with linespoints, \
     "cpu.dat" using 1:5 title "system" with linespoints
pause -1

超大雑把に説明しますと、1番目の時間をx軸、3番目のユーザプロセスの走行した割合と、 5番目のカーネルの走行した割合をy軸とした際のグラフを書け、 というお願いをしています。
(ちなみに、1:3 の 3 や 1:5 の 5 を変えれば別のグラフにできます。)

これを、たとえば sar_cpu.plot というファイル名で保存しますと、 後は以下のように実行するだけです。

  $ gnuplot sar_cpu.plot

実行するとウィンドウが出てきて、 ユーザプロセスとカーネルの走行時間の割合のグラフが出力される…はずです。

おわりに

以上、sysstat を用いてシステムの状態を記録し、記録したデータを参照したり、 グラフにする方法をご紹介しました。

ただし、グラフにできたからといって、簡単に問題点を見つけられるとは限りません。 様々なスキルが必要になってくるように思います。

ですが、そもそも情報がなければ判断のしようがありません。
ですので、来るべきときのために、 まずはシステムの状況を監視することから始めてみてはいかがでしょうか。

宿題の答え

前回の宿題は、

  ところで、D-Bus はなにを使って通信しているのでしょうか?

でした。

D-Bus の仕様を見てみますと、通信手段として、UNIXドメインソケット、 TCP/IP とパイプがあるようです。

D-Bus Specification
http://dbus.freedesktop.org/doc/dbus-specification.html#transports

ですが、/etc/dbus-1/system.conf には以下の行が含まれていますので、 どうやら、UNIXドメインソケットが使われているようです。

  <listen>unix:path=/var/run/dbus/system_bus_socket</listen>

/var/run/dbus/system_bus_socket を確認しますと、 たしかにソケットであることがわかります。

  $ ls -l /var/run/dbus/system_bus_socket
  srwxrwxrwx 1 root root 0 2010-03-18 22:52 /var/run/dbus/system_bus_socket

 

また、D-Busの通信を中継するのは dbus-daemon ですが、 dbus-daemon が実際に上記のソケットを使用しているか、確認してみたいと思います。

まず、dbus-daemon のプロセスIDを調べて、 そのプロセスがオープンしているファイルを、以下の手順で確認します。

  # ps -C dbus-daemon
    PID TTY          TIME CMD
    860 ?        00:00:40 dbus-daemon
   3889 ?        00:00:00 dbus-daemon
  ...
  # ls -l /proc/860/fd/
  total 0
  lrwx------ 1 root root 64 2010-03-31 02:03 0 -> /dev/null
  lrwx------ 1 root root 64 2010-03-31 02:03 1 -> /dev/null
  lrwx------ 1 root root 64 2010-03-31 02:03 10 -> socket:[4651]
  lrwx------ 1 root root 64 2010-03-31 02:03 11 -> socket:[4694]
  lrwx------ 1 root root 64 2010-03-31 02:03 12 -> socket:[4687]
  lrwx------ 1 root root 64 2010-03-31 02:03 13 -> socket:[4777]
  ...

上記では、 プロセスID が 860 のプロセスがオープンしているファイルを確認しています。 たくさんのソケットをオープンしていますね。
それらがUNIXドメインだと仮定すると、 以下のように netstat コマンドを実行することで、具体的なパスなどを確認できます。

  # netstat -anx
  ...
  unix 3 [ ] STREAM CONNECTED 4777  /var/run/dbus/system_bus_socket
  ...
  unix 3 [ ] STREAM CONNECTED 4694  /var/run/dbus/system_bus_socket
  ...
  unix 3 [ ] STREAM CONNECTED 4687  /var/run/dbus/system_bus_socket
  ...
  unix 3 [ ] STREAM CONNECTED 4651  /var/run/dbus/system_bus_socket
  ...

/var/run/dbus/system_bus_socket を使っていることは、まず間違いないと思います。

 

念のため、クライアントのひとつである dbus-send についても、 確認をしておこうと思います。
具体的には、以下のように、strace コマンドで追いかけてみました。

  $ strace dbus-send --system --dest=org.freedesktop.NetworkManager \
  --type=method_call --print-reply /org/freedesktop/NetworkManager \
  org.freedesktop.NetworkManager.GetDevices
  ...
  socket(PF_FILE, SOCK_STREAM, 0)         = 3
  connect(3, {sa_family=AF_FILE, \
  path="/var/run/dbus/system_bus_socket"} , 33) = 0
  ...
はい、/var/run/dbus/system_bus_socket に connect し、 そのソケット(ファイル記述子 3)に対して読み書きしていました。

今回の宿題

今回の宿題は、

  sysstatの情報をグラフにするコマンドを作ってみましょう。

です。

gnuplot でいきなりウィンドウで出てこられても困る、 という状況もあると思います。
ですので、ここはひとつ、グラフの画像を出力するコマンドに仕立て上げたいと思います。

あとがき

先日、誕生日を迎えまして、とうとう40歳になってしまいました。
もし私が信長だったら、あと10年しか生きられないことになります。
(とはいえ、「人生50年」と言いつつ、信長は49歳で自害しています。)

しかし、いくつになっても勉強は必須ですし、 チャレンジ精神も忘れてはならないと思っています。
ただ、そう思ってはいても、実際には行動していない、 などということもありがちではないかと思います。

そうならないために、今春の情報処理技術者試験に申し込んでみました。

情報処理推進機構 : 情報処理技術者試験
http://www.jitec.ipa.go.jp/

前回、ネットワークスペシャリストの試験を受けたのが、2001年秋でしたので、 じつに8年半ぶりの試験ということになります。

今回は、自分の本業の組み込み系のスキルはどんなもんなのかな? という疑問を起点としていますので、 エンベデッドシステムスペシャリスト試験(長い名前ですね…)にトライしてみました。

とはいえ、申し込んだだけでは、行動したことになりません。
やはり、前もって試験勉強を行い、万全の体制で挑んでこそ、 チャレンジしたと言えるのではないでしょうか。

実は、試験当日と次回予定日も 4月18日(日) です。
というわけで、それまでは試験勉強に専念したいと思いますので、 次回はお休みをいただきたいと思います。

全然チャレンジじゃないね、と思われた貴兄は、まさにおっしゃる通りだと思います。 申し訳ありません…。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、黄金週間真っ最中!な 5月2日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 毎日の栗画の他に、頼まれた栗画を描かねば…。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本