Browse Month: August 2011

Nagios Plugin シェルスクリプト版テンプレート

自作の Nagios プラグインをシェルスクリプトで作成するとき、今まで自分で STATE_OK と定義していたのですが、他のシェルスクリプトでできている Nagios プラグインをみてみたところ、Nagios プラグインに付属している utils.sh を使っていました。

utils.sh は、次のような内容でした。

#! /bin/sh

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

if test -x /usr/bin/printf; then
ECHO=/usr/bin/printf
else
ECHO=echo
fi

print_revision() {
echo "$1 v$2 (nagios-plugins 1.4.15)"
$ECHO "The nagios plugins come with ABSOLUTELY NO WARRANTY. You may redistribute\ncopies of the plugins under the terms of the GNU General Public License.\nFor more information about these matters, see the file named COPYING.\n" | sed -e 's/\n/ /g'
}

support() {
$ECHO "Send email to nagios-users@lists.sourceforge.net if you have questions\nregarding use of this software. To submit patches or suggest improvements,\nsend email to nagiosplug-devel@lists.sourceforge.net.\nPlease include version information with all correspondence (when possible,\nuse output from the --version option of the plugin itself).\n" | sed -e 's/\n/ /g'
}

なるほど、この utils.sh を使えば、かなり便利そうです。
この utils.sh を組み込んで、さらに –hostname パラメータを解析する Nagios プラグインのテンプレートを次のように作ってみました。

#!/bin/sh

PROGNAME=`basename $0`
PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'`

. $PROGPATH/utils.sh

for i in $*; do
case $i in
--hostname=*)
HOSTNAME=`echo $i | awk -F= '{print $2}'`
;;
*)
;;
esac
done

(さまざまな処理)

exit $STATE_OK

しばらくこのテンプレートをベースに自作の Nagios Plugin を作成してみようと思います。

KVM virtio ベンチマーク

KVM で virtio を使わなかったときと使ったときのベンチマークを、カジュアルに計測してみました。ベンチマークは、virtio_net は Using VirtIO NIC – KVM と同じ内容もの、virtio_disk は hdparm で計測してみました。

環境は、Host/Guest ともに CentOS 5.6 x86_64。サーバは、モダンなもので、同じネットワーク上にあるホストから Guest の CentOS 5.6 に iperf を使ってベンチマークを計測してみました。

virtio_net


$ iperf -c -w 65536 -p 12345 -t 60
virtio_net なし
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-60.1 sec 1023 MBytes 143 Mbits/sec

virtio_net あり
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-60.0 sec 6.57 GBytes 940 Mbits/sec

$ iperf -c -w 65536 -p 12345 -t 60 -d
virtio_net なし
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-60.0 sec 2.66 GBytes 381 Mbits/sec
[ 5] 0.0-60.0 sec 280 MBytes 39.1 Mbits/sec

virtio_net あり
[ ID] Interval Transfer Bandwidth
[ 5] 0.0-60.0 sec 4.98 GBytes 713 Mbits/sec
[ 4] 0.0-60.0 sec 5.66 GBytes 810 Mbits/sec

$ iperf -c -w 65536 -p 12345 -t 60 -P 4
virtio_net なし
[ ID] Interval Transfer Bandwidth
[ 5] 0.0-60.0 sec 1021 MBytes 143 Mbits/sec
[ 6] 0.0-60.0 sec 944 MBytes 132 Mbits/sec
[ 4] 0.0-60.0 sec 771 MBytes 108 Mbits/sec
[ 3] 0.0-60.1 sec 851 MBytes 119 Mbits/sec
[SUM] 0.0-60.1 sec 3.50 GBytes 501 Mbits/sec

virtio_net あり
[ ID] Interval Transfer Bandwidth
[ 6] 0.0-60.0 sec 1.65 GBytes 236 Mbits/sec
[ 3] 0.0-60.0 sec 1.64 GBytes 234 Mbits/sec
[ 5] 0.0-60.0 sec 1.65 GBytes 236 Mbits/sec
[ 4] 0.0-60.0 sec 1.64 GBytes 234 Mbits/sec
[SUM] 0.0-60.0 sec 6.57 GBytes 941 Mbits/sec

すばらしい結果です、virtio_net がある場合とない場合とではかなりネットワークのパフォーマンスが違ってきます。これは、virtio_net を設定するのは必須です。

ここで、あとから virtio_net に切り替える方法を紹介してきます。

1. /etc/libvirt/qemu/.xml を編集して、interface 部分にを追加します。例えば、次のような感じで設定を追加します
<interface type=’bridge’>
<mac address=’xx:xx:xx:xx:xx:xx’/>
<source bridge=’br0’/>
<model type=’virtio’/>
</interface>

2. virsh define /etc/libvirt/qemu/.xml を実行して、設定を反映させます

3. guest を再起動します、再起動すると /etc/sysconfig/network-script/ifcfg-eth0.bak に置き換えられているため、virsh console でコンソールから eth0 の設定ファイルを元に戻して network サービスを再起動します

virtio_net の効果ですが、virtio_net がない場合、かなり drop パケットや nagios プラグインの check_ntp_time のチェックで「Offset Unknown」というエラーが頻発していましたが、virtio_net を使ったあとは drop パケット 0、check_ntp_time のチェックも問題がなくなりました。

KVM 環境において、virtio_net は必須かと思います。

この他にも、vhost_net を組み込むことで、ネットワークのパフォーマンスがさらに向上するらしいのですが、CentOS 5.6 x86_64 の環境にも組み込まれていませんでした。。。qemu-kvm 0.13.0 以降からの用です。

次の virtio_disk。

virtio_disk なし
# /sbin/hdparm -t /dev/hda
/dev/hda:
Timing buffered disk reads: 330 MB in 3.02 seconds = 109.41 MB/sec

virtio_disk あり
# /sbin/hdparm -t /dev/vda
/dev/vda:
Timing buffered disk reads: 354 MB in 3.01 seconds = 117.47 MB/sec

ディスクの読み込みパフォーマンスのみチェックしましたが、virtio_net よりは効果は低いものの、virtio_disk を組み込むとパフォーマンスが向上しました。
virtio_disk も必須だと思いますが、virtio_disk をあとから組み込む場合はハードディスクのブロックデバイスが /dev/vda に変わってしまうので、頑張ればできるかと思いますが、virtio_disk を使いたい場合は再セットアップした方がいいでしょう。

virt_install を使って、virtio を組み込む方法ですが、 –disk オプションに bus=virtio を追加するだけで、virtio_disk、virtio_net の両方を使うことができます。

別途、KVM を使った VM の作り方、設定方法、監視周りなどのエントリをする予定です!

Enjoy, KVM!

rails 2.3 + rubygems 1.8.7

rails 2.3 + rubygems 1.8.7 の組み合わせで使っていると、次のような警告が発生します。
毎回、コンソール画面上で警告が表示されるのはけっこううざいので、その対策方法を紹介します。

NOTE: Gem.source_index is deprecated, use Specification. It will be removed on or after 2011-11-01.
Gem.source_index called from /Users/n0ts/.rvm/gems/ree-1.8.7-2011.03/gems/rails-2.3.12/lib/rails/gem_dependency.rb:21.
NOTE: Gem.all_load_paths is deprecated with no replacement. It will be removed on or after 2011-10-01.
Gem.all_load_paths called from /Users/n0ts/.rvm/gems/ree-1.8.7-2011.03/gems/gettext-2.1.0/lib/gettext/runtime/locale_path.rb:56.
NOTE: Gem.all_partials is deprecated with no replacement. It will be removed on or after 2011-10-01.
Gem.all_partials called from /Users/n0ts/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/site_ruby/1.8/rubygems.rb:258.
NOTE: Gem.all_partials is deprecated with no replacement. It will be removed on or after 2011-10-01.
Gem.all_partials called from /Users/n0ts/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/site_ruby/1.8/rubygems.rb:258.

それぞれ、2011-10-01, 2011-11-01 以降に rubygems から、該当のものが削除されてしまうという警告です。
とても親切な警告でありがたいですが、rubygems 1.8.7 を使う明確は理由は、今のところないですから、警告を非表示にしてみます。

その方法とは、rubygems を、次のようにダウングレードすることです。

gem update --system 1.6.2

rails 3.1 系にアップデートしたら、rubygems を 1.8.7 にすればたぶん大丈夫かと思いますよね。
rubygems の進化のスピードが速すぎて、ruby のバージョンを超えてしまう事態になってしまうかもしれないとふと思いました。。。

カジュアルに homebrew で MySQL 5.1 をインストールする方法

homebrew で、mysql をインストールするときは、次の方法でカジュアルにインストールして使うことができます。

$ brew install mysql

ただし、MySQL 5.5 系がインストールされてしまいます。大人の事情で MySQL 5.1 系を使いたいときは、homebrew にはバージョンを指定してインストールすることができませんが、次のようにすると、簡単にインストールすることができます。

$ brew install https://raw.github.com/adamv/homebrew-alt/master/versions/mysql51.rb

今まで自分のローカル homebrew で Formula を追加していましたが、上のようにさくっと指定できることは知りませんでした。これで、カジュアルに MySQL 5.0 や 4.0 などをインストールして使いたいときも安心ですね。

あと、mysql_install_db するときは、次のコマンドでインストールしないと、ただしく mysql データベースが作成されないので、注意してください。MySQL 5.5 系でも同じ問題があったようです。

$ mysql_install_db --user=mysql --tmpdir=/tmp

homebrew の mysql の basedir は、homebrew のインストール先の var/mysql ディレクトリになるので my.cnf を設定した場合は自分で var/mysql ディレクトリに作成するようにしましょう。

mysql_secure_installation 小技

一般的に MySQL サーバを構築するとき、mysql_secure_installation を使うのが一般的だと思いますが、mysqld_multi などを使っている環境下の場合、mysql_secure_installation は UNIX ドメインソケットを設定できないため、個別の MySQL に対して mysql_secure_installation を実行することができません。

mysql_secure_installation は、my.cnf の設定にも左右されますが、通常 /var/lib/mysql/mysql.sock をデフォルトで使うため、次のようにすると簡単にできますよね。

例えば、/var/lib/mysql/mysql_db1.sock と /var/lib/mysql/mysql_db2.sock がある場合、前者の MySQL に対して mysql_secure_installation を実行するには、次のようにします。


# ln -s /var/lib/mysql/mysql-db1.sock /var/lib/mysql.sock
# /usr/bin/mysql_secure_installation
# rm -f /var/lib/mysql/mysql.sock

おそらく、my.cnf の設定変更でもいけるはずですが、mysql_secure_installation を実行するのは、最初の一回だけなので、上記の方法の方がシンプルでよいです。

mysql_secure_installation については、次の「エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド」の 6.1 項に詳しく書かれていますので参考にしてください。
とても便利です。

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド
奥野 幹也
技術評論社
売り上げランキング: 60563

perf for CentOS

perf というツールを、僕も初めて知ったけれど、みんな大好き CentOS 5 系にはないみたい。。。

Fedora だと Fedora 13 あたりから perf パッケージがある様子。
さらに調べてみると、perf というツールの公式ページドキュメントはここにある。
perf というツールは、どうも linux-kernel に付属しているツールの様子。

CentOS 6 からインストールできる。
使い方は、このページを参考にすると、次のように使えるみたい。


$ perf record -a -g sleep 10 # 10秒おきにシステム情報を記録する
$ perf report --sort comm,dso # レポートを表示する

そうすると、次のような画面になる様子。
perf

なるほど、これは便利そう。

mod_rewrite で独自の変数を使う方法

Apache の mod_rewrite で、SetEnv や SetEnvIf した変数を使う方法にすこしはまったので、備忘録として残しておきます。

まず、最初にやりたかったのは、次のような VirtualHost を定義している状態で、任意のサーバへリバースプロキシとして設定しているとき、リクエストホスト名ごとにリバースプロキシするときのポート番号を変更したかった。


ServerName s*.example.com
LogLevel warn
ErrorLog "|/usr/sbin/cronolog /var/log/server_error_log.%Y%m%d"
CustomLog "/var/log/example_access_log.%Y%m%d" combined

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SetEnvIf User-Agent “.*MSIE.*” \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

SSLProxyEngine On
RewriteEngine On
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [P,L]

RewriteRule の中で変数を使うには、%{ENV:変数名} という書式を使用する。なので、その前に SetEnv あるいは SetEnvIf すればその変数を使えるのかなと試してみたけれど、使えなかった。

結局、次のようにしたらできるようになった。

...
SSLProxyEngine On
RewriteEngine On
RewriteRule ^(.*)$ - [E=PORT:2381]
RewriteCond %{HTTP_HOST} ^s[1-5]\.example\.com$ [NC]
RewriteRule ^(.*)$ - [E=PORT:1311]
RewriteRule (.*) https://%{HTTP_HOST}:%{ENV:PORT}%{REQUEST_URI} [P,L]

上のルールだと、リクエストホスト名が s1.example.com から s5.example.com までのとき、バックエンドの sX.example.com:1311 にリバースプロキシ接続する。それ以外のホスト名のとき、sX.example.com:2381 へ接続するというルールになる。