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

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


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

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

あっという間に、黄金週…もとい、大型連休の中盤にさしかかろうとしていますね。
我が家では、大阪のハイテンションな中学生が泊まりで遊びに来ていて、 毎日にぎやかな日々をすごしています。

さて、前回、情報処理技術者試験の勉強のためお休みをいただきました。
おかげさまで…かどうかはさだかではありませんが、午前の試験に関しては、 合格ラインの60%になんとか到達しているようです。

というのも、午前のマークシートの問題と解答が、 ありがたいことに即日公開されましたので、 よくも悪しくも自己採点ができてしまった…という次第です。 (午後の解答は、6月11日に公開される予定です。)

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

ちなみに、上記サイトには、過去の問題と解答も公開されています。

実は、わたしが行った試験勉強は、本を買わずに、 上記から過去の問題を数年分入手して解いだけ、というチープなものでした。

もし、今後、会社などで強制的に受験をさせられることがありましたら、 何もしないでいきなり本番に挑むのではなく、 過去の問題を少しでも解くことをおすすめします。
ただ問題を解くだけでも、出される問題の雰囲気を感じられますし、 午前のマークシートなら1問くらいは同じ問題が出るかもしれません。
ですので、なにもしないよりは、合格する可能性が高くなるのではないかと思います。

まあ、わたしの場合、午後で落ちている可能性がかなりありそうなので、 成功体験みたいなものからはほど遠いのですが…。
(もし万が一受かったら、成功体験として高らかに語りたいと思います。)

絵に描いた餅的な話は終わりにして、今回もはりきってまいります。

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

前回は、sysstat の概要と、sar コマンドの使い方をご紹介しました。

Vol.177 - sysstat でシステムの状態を監視する
http://www.usupi.org/sysad/177.html

とはいえ、その場限りっぽい使い方しかご紹介できませんでした。

実は、sysstat パッケージをインストールしますと、 cron を使って定期的に情報を収集してくれます。 (あるいは、設定次第でそうなります。)

ですので、今回は、sysstat パッケージが cron を使って行う処理の内容について、 ご紹介したいと思います。

また、負荷が高まったときなどの際に、後から確認してその状態がわかるかどうかも、 実際に試してみたいと思います。

cron による定期的な記録

RedHat 系の場合は、sysstat パッケージをインストールしますと、 特になにも設定しなくても、システムの状態を定期的に記録してくれます。

ですが、Debian 系の場合、 インストールしただけでは定期的に記録してくれないようになっています。
定期的に記録してもらうには、 /etc/default/sysstat の ENABLED の行を以下のように変更する必要があります。

  ENABLED="true"

そうしますと、RedHat 系の場合は /var/log/sa/sa日、 Debian 系の場合は /var/log/sysstat/sa日 というファイルに、 システムの状態が定期的に記録されていきます。

 

具体的に、どのくらいの頻度で記録されていくかと言いますと、当たり前ですが、 cron の設定によります。
たとえば、Fedora12 の場合、 /etc/cron.d/sysstat の内容が以下のようになっています。(一部省略しています。)

  # Run system activity accounting tool every 10 minutes
  */10 * * * * root /usr/lib/sa/sa1 -S DISK 1 1
  # Generate a daily summary of process accounting at 23:53
  53 23 * * * root /usr/lib/sa/sa2 -A

10分毎に /usr/lib/sa/sa1 を起動して /var/log/sa/sa日 に情報を記録していき、 1日の終わり(23時53分)に /usr/lib/sa/sa2 を起動します。
/usr/lib/sa/sa2 は、/var/log/sa/sa日 をもとに、 sar コマンドで参照した結果を /var/log/sa/sar日 というファイルに保存します。

かたや、Ubuntu 9.10 の場合は、/etc/cron.d/sysstat の内容が、 以下のようになっています。(一部省略しています。)

  PATH=/usr/lib/sysstat:/usr/sbin:/usr/sbin:/usr/bin:/sbin:/bin
  # Activity reports every 10 minutes everyday
  5-55/10 * * * * root command -v debian-sa1 > /dev/null && debian-sa1 1 1
  # Additional run at 23:59 to rotate the statistics file
  59 23 * * * root command -v debian-sa1 > /dev/null && debian-sa1 60 2

10分毎と1日の終わり(23時59分)に /usr/lib/sysstat/debian-sa1 を起動するようになっています。
debian-sa1 は、前述の /etc/default/sysstat の ENABLED が "true" の場合にのみ、 /usr/lib/sysstat/sa1 を起動します。

また、/etc/cron.daily/sysstat では、同様に ENABLE が "true" の場合のみ、 /usr/lib/sysstat/sa2 を起動するようになっています。

 

ですので、大雑把に言ってしまえば、10分毎に sa1 で情報を収集して、 1日の最後に sa2 でテキストに変換している、ということになります。

 

ただ、このままの状態ですと、7日分の情報しか保存されません。
最新の7日分以外のファイルは、sa2 によって否応なく消し去られます。

これを変更するには、RedHat 系の場合は /etc/sysconfig/sysstat の、 Debian 系の場合は /etc/sysstat/sysstat の HISTORY を変更します。
たとえば、最新の14日分を保存するには、以下のように書き換えます。

  HISTORY=14

ちなみに、HISTORY を28より大きく設定しますと、記録されるファイルのパスが、 以下のように変わります。

  /var/log/sa/年月/sa日  (あるいは /var/log/sysstat/年月/sa日)
  /var/log/sa/年月/sar日 (あるいは /var/log/sysstat/年月/sar日)

ありがたいことに、最新のファイルは、従来通りのパスで参照できます。

さらに、10日以上古い sar日 は、sa2 が bzip2 などで圧縮します。
これも、/etc/sysconfig/sysstat もしくは /etc/sysstat/sysstat の中の COMPRESSAFTER を変更することで、カスタマイズできます。
たとえば、7日に設定したい場合は、 sysstat の COMPRESSAFTER を以下のように書き換えてください。

  COMPRESSAFTER=7

実際に確認してみます

それでは次に、何らかの負荷をかけてみて、 sysstat によって記録された情報から実際に読み取れるかどうかを、 確認してみたいと思います。

 

まずは、ネットワークに負荷をかけてみましょう。
方法はいろいろあると思いますが、 ここでは、flood ping というものを使ってみます。
Flood ping とは、pingを(ICMP Echo Request を)ひたすら送りまくるというものです。 以下のように、-f オプションをつけて ping コマンドを実行します。

ただ、ネットワークに負荷をかける必要がありますので、 ping コマンドは別のマシンから(対象のマシンに対して)実行してください。
また、root の権限が必要ですので、 root になるか sudo コマンド経由で実行する必要があります。

  別のマシン# ping -f 対象のマシン
  ...
  184437 packets transmitted, 184437 received, 0% packet loss, time 96186ms
  rtt min/avg/max/mdev = 0.093/0.269/6.582/0.111 ms, ipg/ewma 0.521/0.297 ms

そして、10〜20分くらい経ってから、sar コマンドで確認してみます。
(以下は、Debian 系で、今日が2日の場合の実行例です。
eth0 の後、rxpck/s, txpck/s, rxkB/s, txkB/s, ... と続きます。)

  $ sar -n DEV -f /var/log/sysstat/sa02 | grep eth0
  ...
  11:45:01  eth0    3.61    4.06   3.19   0.71  0.00  0.00  0.00
  11:55:01  eth0  309.64  309.68  30.90  29.68  0.00  0.00  0.00
  12:05:01  eth0    0.16    0.12   0.02   0.02  0.00  0.00  0.00
    ...

ping -f を実行したのは11時50分前後でしたが、 11時45〜55分の結果だけ、やけに突出した値になっています。

ping -f で送信したパケット数も受信したパケット数も、 ともに 184437 でしたので、184437÷300= 307.4 パケット/秒 となり、 記録された値とだいたい同じであることがわかります。
(他にたいした通信をしていなかったためだと思います。)

 

さて、次は、CPU に負荷をかけてみたいと思います。
つまり、プロセスを延々と走らせてみます。
具体的には、以下のスクリプトを用いて、 ひたすら実行しまくるプロセス(yesコマンド)を2つ起動し、90秒後に強制終了させます。

  #!/bin/sh
  yes > /dev/null &
  PID1=$!
  yes > /dev/null &
  PID2=$!
  sleep 90
  kill $PID1
  kill $PID2

洗練されているとは言い難いスクリプトですが、気にせず実行します。
そして、先ほどと同様、10〜20分後に、sar コマンドで確認してみます。
(all の後、%user, %nice, %system, %iowait, %steal, %idle です。)

  $ sar -u -f /var/log/sysstat/sa02
  ...
  12:15:01    all    4.02    0.00    0.87    0.35    0.00   94.76
  12:25:01    all   21.48    0.00    2.22    0.48    0.00   75.82
  12:35:01    all   13.26    0.00    3.92    0.37    0.00   82.44
  ...

12時19分前後に実行しましたので、 12時15〜25分の結果が突出しているのがわかると思います。

おわりに

以上、sysstat が cron を使ってシステムを定期的に監視する際、 どんな風に動作するのかを、さらっとご紹介しました。
また、実際に負荷をかけたときに値が変わるかどうかを確認する方法も、 簡単にご紹介しました。

実際には、こんなにわかりやすく検出できることはあまりないと思います。
ですが、なにか問題が発生したときに、後から記録をみて、 前兆のようなものを発見できますと、今度は問題が発生する前に気づいて、 対策を打つことができるかもしれません。

なんにせよ、備えは必要だと思いますので、sysstat で定期的に記録し、 ときどきはそのデータを眺めてみてはいかがでしょうか。

また、sa1 や sa2 はシェルスクリプトですので、中身を読めば、 処理の内容がそれとなくわかるのではないかと思います。
他にも設定の余地がいくつかありますので、 解読してカスタマイズなどにトライしてみてくださいまし。

宿題の答え

前回の宿題は、

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

でした。

というわけで、I/Oの統計情報のうち、tps、 rtps および wtps のグラフを PNG ファイルとして出力するシェルスクリプトを、 作ってみました。

  #!/bin/sh
  if [ $# -ne 2 ]; then
      echo "Usage: $0 in_file out_file"
      exit 1
  fi
  LANG=C
  export LANG
  TMPFILE=/tmp/sysstat-plot-$$
  trap 'rm -f $TMPFILE' 0 1 2 3 9 11 15
  INFILE="$1"
  OUTFILE="$2"
  sar -b -f "$INFILE" | grep '^[0-9]' | grep -v bread > "$TMPFILE"
  gnuplot << E-O-F
  set terminal png
  set output "$OUTFILE"
  set xdata time
  set timefmt "%H:%M:%S"
  set format x "%H:%M"
  plot "$TMPFILE" using 1:2 title "tps" with lines, \
       "$TMPFILE" using 1:3 title "rtps" with lines, \
       "$TMPFILE" using 1:4 title "wtps" with lines
  E-O-F

このスクリプトを、たとえば sar2png_io.sh というファイル名で保存をしましたら、 いつものように実行可能な状態にします。

  $ chmod +x sar2png_io.sh

そして、第1引数に収集したデータのファイル、 第2引数に出力されるPNGファイルの名前を指定して、 スクリプトを実行してみてください。

  $ ./sar2png_io.sh /var/log/sysstat/sa30 sa30.png

カレントディレクトリに sa30.png というファイルができたと思います。
そして、このファイルを display コマンド等で見ますと、 I/Oの統計情報のグラフになっていることがわかると思います。

また、sar コマンドの実行時に指定するオプションと、 gnuplot コマンドに渡す最後の plot 命令を変更すれば、別のグラフにできます。
たとえば、ネットワーク・インターフェース eth0 の送受信パケット数のグラフを作成するには、スクリプトを以下のように変更します。

  ...前略...
  sar -n DEV -f "$INFILE" | grep '^[0-9]' | grep eth0 > "$TMPFILE"
  ...中略...
  plot "$TMPFILE" using 1:3 title "rxpck/s" with lines, \
       "$TMPFILE" using 1:4 title "txpck/s" with lines
  E-O-F
これを、たとえば sar2png_dev.sh という名前で保存しましたら、 先ほどと同様に実行してみましょう。
  $ chmod +x sar2png_dev.sh
  $ ./sar2png_dev.sh /var/log/sysstat/sa01 sa01.png

他にもいくつか情報がありますので、いろいろ試してみてくださいませ。

今回の宿題

今回の宿題は、

  sysstat が収集したその日の情報から、グラフを自動生成しましょう。

です。

/var/log/sa/sar日 あるいは /var/log/sysstat/sar日を眺めても、 値の羅列だからピンと来ないなあ、と思うことが多いように思います。

ここはやはり、グラフにしておくとわかりやすいのではないでしょうか。
というわけで、その日の sa日 からグラフを生成するよう、 仕込んでみてくださいませ。
(全部は大変なので、まずは主要なものだけでよいように思います。)

あとがき

わたくし、基本的には、マウスに極力触りたくない派に属しています。
つまり、なんでもかんでもコマンドラインで作業をしたいひとです。

ですが、GUI を毛嫌いしているわけではありません。
グラフィカルに表現されること自体は、 必要なリソースを取られてしまうのでなければ、別に構わないよと思っています。
いえ、むしろ、コマンドラインからグラフィカルに何かできるといいな、 とすら思っておりました。

そうしましたら、スラッシュドット経由で、 コマンドラインから GUI を操作する方法が紹介されていました。

シェルスクリプトに香辛料 - スラッシュドット・ジャパン
http://slashdot.jp/hardware/article.pl?sid=10/04/21/010204

情報元は以下です。10種類の方法が紹介されています。

10 Tools To Add Some Spice To Your UNIX Shell Scripts
http://www.cyberciti.biz/tips/spice-up-your-unix-linux-shell-scripts.html

 

その中で個人的にびびっと来たのが、notify-send と zenity です。

notify-send は、指定したメッセージを、 ポップアップ形式でデスクトップに表示してくれるコマンドです。
(ネットワークの状況などをおせっかいに知らせてくれるアレですね。)

ちなみに、使用するには libnotify もしくは libnotify-bin パッケージが必要です。

使い方は、以下のように、メッセージを引数に指定するだけです。

  $ notify-send "早く帰らないと晩ご飯に間に合わないよ!"

以下のように、-i オプションでアイコンを付加することも可能です。

  $ notify-send -i important "もう晩飯だ急げ!"

指定するアイコン名は、/usr/share/icons 以下などのファイル名から、 サフィックスを取り除けばよいようです。
あるいは、直接画像ファイルを指定すると、それが表示されます。

 

かたや zenity は、ダイアログを表示してくれるコマンドです。
シンプルにお知らせするだけのものから、カレンダーやらプログレスバーやらまで、 非常に幅広く表現できるようになっています。
こちらは、コマンドと同名の zenity パッケージが必要です。

たとえば、ファイルを選択したければ、以下のように実行します。
選択して OK を押すと、標準出力にパスが出力されて終了します。

  $ zenity --file-selection --title "どれがいい?"

面白いのは、プログレスバーでしょうか。 標準入力からパーセンテージをお知らせしてあげると、その通りにバーが進みます。

  $ for p in `seq 100`; do echo $p; sleep 0.1; done | \
  zenity --progress --title "がんばって処理してるよ"

 

他にも、GUI だけでなく、端末上に出力してくれるコマンドなども、 例を交えていろいろと紹介してくれています。
興味のある貴兄は、必要なパッケージを入れて試してみてくださいませ。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、5月16日(日) の未明にお会いしましょう!

 

「いますぐ実践! 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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本