サーバのリソース監視&グラフ化を行なうソフトウェアは色々ありますが、今日は導入が簡単と言われているMuninを紹介したいと思います。
個人的に感じているMuninの良い点としては
- インストール&初期設定が簡単
- デフォルトで監視できる対象が多い
- プラグイン機構があり、任意のリソースのグラフ化が可能
が挙げられます。仕事で使うのは Cacti とかがいいと思いますが、個人利用としては Munin はとてもお手軽でおすすめです。
インストール
Ubuntu Linuxだとdebパッケージがあるのでaptitudeでインストールするだけです(Fedore CoreやCentOSにもRPMがあります)。
$ sudo aptitude install munin
インストールしたら、munin-nodeというプログラムが起動しているかどうかを調べます。
$ ps auxww |grep munin-node
もし起動していない場合は下記の要領で起動しておきましょう。
$ sudo /etc/init.d/munin-node start
設定
Muninは munin-node というサーバに常駐してリソースの情報を集めるエージェントと、そのエージェントから情報を集約してリソースの状況をグラフ化する munin 本体の2つがあります。今回は1台のサーバを監視するので特に意識する必要はありませんが、サーバが複数台になった場合は、munin-node を監視したいサーバにインストールする必要があります。
なお、Munin自体はデフォルトのままでも使用できますが、 Muninが /var/www/munin/ に生成したグラフのファイルをブラウザから見れるように、Apacheに以下の設定を追加します。
Alias /munin/ /var/www/munin/
<Directory "/var/www/munin">
Options Indexes +SymLinksIfOwnerMatch MultiViews ExecCGI
AllowOverride FileInfo AuthConfig Limit Indexes
Order allow,deny
Allow from all
</Directory>
設定したら Apache を再起動します。5分ぐらい待ってから http://yourhost/munin/ をブラウザで開くと下記のような画面が表示されるかと思います。待てないせっかちな人は下記を実行してみてください(muninのHTMLが生成されます)。
$ sudo -u munin munin-cron

監視したいリソースの追加
デフォルトでは Munin にはApacheやMySQLなどの状況をグラフ化するプラグインが付属しているので、これを有効にしてみましょう。例えば Apache 関連のものは
$ sudo ln -s /usr/share/munin/plugins/apache_* /etc/munin/plugins/
のように、/etc/munin/plugins/の下にpluginのシンボリックリンクを貼るだけで監視対象とすることができます。あ、ただ munin-node の再起動が必要ですが…
$ sudo /etc/init.d/munin-node restart
なお、グラフが更新されるのは5分に1回なので、監視対象を追加した場合反映されるのは5分後になります。以下は apache_accesses の状況です。

プラグインのダウンロード
デフォルトでもかなりの数のプラグインが揃っていますが、memcachedなどのリソース監視を行うプラグインもあります。そのような野良プラグインはMuninExchangeにアップされているので、使えそうなものがないかチェックしておくと良いでしょう。
まとめ
Muninのお手軽さが少しは伝わったでしょうか?日本語の情報はあまりありませんが、Munin自体はとてもシンプルかつ導入が簡単なので、「試しに入れてみよう」というとっかかりになれば幸いです。プラグインで任意のリソースをグラフ化することができるのも大きなメリットなので、時間があったらプラグインの書き方でも説明したいと思います。
いまさら感が漂いますが、会社の同僚に借りて読んでみました。結論からいうとユーザビリティについて当たり前のことが簡潔にまとまっている良書です。自分用に一冊買おうかと思うぐらいでした。この本から学んだことはたくさんありましたが、記憶に残っている部分を箇条書きにしておきます。
- ユーザに考えさせない: 言葉は直感的にわかるものを選んで使用する。何の情報がどこにあるかを明確にしておく。ボタンはクリックできるものだとユーザが認識できるようにデザインする。
- 人はページ内の文章は読まない。ざっと読むだけ: ユーザは大抵急いでいるので全ての文章を読んだりしない。
- サイトの左上のロゴ(ID)は重要: ユーザは自分が今どのサイトにいるのかわかるようにするため。
- ユーザビリティテストは難しくない: ユーザビリティテストには何十人も必要なわけではない。たとえ一人だけのテストでもやらないよりは100%マシ。
- ユーザをもてなす心が大事: ユーザに不要な情報を入力させたりしないこと。プライバシーに関する情報を過度に取得するとユーザの信頼を失う。
とにかく、今までこんないい本を読んでいなかったことが非常に悔やまれるぐらいのいい本です。
昨日のサーバリプレースでこのブログの移行も行なったのですが、
- データはMySQLのデータベースに保存されているので、mysqldumpしてそれを新しいサーバでインポート
- WordPressのファイルは rsync で一括転送
して動作確認をしていたところ、どうも wp-admin の管理画面からログインすると
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 71 bytes) in /path-to-wordpress/wp-includes/gettext.php on line 91
というエラーが… メモリがオーバフローしているみたいなのでググってみると「php.iniのmemory_limitを増やせば直る」とか書いてあるのですが、それをやっても全然直らずに途方に暮れていました。もしかすると i386 -> amd64 のアーキテクチャ変更がまずかったのか?とあたりをつけて色々試してみたところ、WordPressの管理画面の言語を ja から en に変更したらあっさり直りました!
具体的には wp-config.php の以下の部分を修正。
@@ -29,7 +29,7 @@
// と設定すると、日本語 (UTF-8) がサポートされます。
// (訳注: このパッケージでは日本語 (UTF-8) が設定されているので、そのままお使いの場合は
// 変更する必要はありません。)
-define ('WPLANG', 'ja');
+define ('WPLANG', 'en');
いやはや、もう再インストールを覚悟していたので、問題回避できただけでもよかったです。日本語リソースの ja.mo が悪さをしていたのでしょうか?本当の原因がわかってないのが気持ち悪いですが、とりあえず良しとします。
今回このブログのサーバをリプレースするにあたり、Ubuntu Linuxを32bitから64bit(amd64)にしたのですが、64bit環境で32bit向けのi386バイナリを実行する必要があったのでその方法をメモしておきます。結論から書くと
$ sudo aptitude install ia32-libs
して ia32-libs というパッケージをインストールするだけで、32bit向けのバイナリが64bit環境で実行できるようになります。
なんでこれが必要だったかというと、Dynamic DNSのIP更新ツールとしてDiCE for Linuxを使用していて、これだけは32bit向けのバイナリしか配布しておらず、64bit環境で実行しようとすると下記のエラーが出てしまっていました。
$ sudo /usr/local/DiCE/diced -e0
sudo: unable to execute /usr/local/DiCE/diced: No such file or directory
どうしたものかなと思ってググってみると、Adobe Flashなどの32ビットアプリケーションを64ビットLinux上で利用するという記事を発見して ia32-libs の存在を知りました。こういうのもちゃんとパッケージ化されていて一発でインストールできるのがDebianの素晴らしいところですね。
長らく使用していたiNoveですが、黒とグレーで覆われたカラーがダークな印象を与えているようで嫌だったので、もうちょっと優しい色のテーマを探していました。色々探したところHello :Dがなかなかいい色使いだったので重い腰を上げてテーマを変更。
デフォルトのままだと幾つか気になる点があったので以下の点を変更しました。これでだいぶ見やすくなってかなり満足です。
サイドバーのリンク
右側のサイドバーのリンクはアンダーラインがなくてリンクだと認識されにくかったので、下線を引くように修正しました。
Index: css/default.css
===================================================================
--- css/default.css (revision 33)
+++ css/default.css (working copy)
@@ -350,7 +354,6 @@
#sidebar a {
color: #333;
-text-decoration: none;
}
#sidebar a:hover {
既読リンクの色を変えるように
デフォルトでは未読リンクも既読リンクの色も同じだったのですが、個人的なユーザビリティ哲学として既読リンクはわかるようにしたかったので、これを紫にするように修正。
Index: css/default.css
===================================================================
--- css/default.css (revision 33)
+++ css/default.css (working copy)
@@ -38,7 +38,7 @@
text-decoration: none;
}
-h1 a:hover, h1 a:active {
+h1 a:hover, h1 a:active, h1 a:visited {
color: #fff;
}
@@ -130,6 +130,10 @@
text-decoration: none;
}
+a:visited {
+color: purple;
+}
+
a {
color: #0063DC;
text-decoration: underline;
@@ -269,6 +269,11 @@
text-decoration: underline;
}
+.title h2 a:visited {
+color: #369
+text-decoration: none;
+}
+
.postdata {
color: #690;
margin-left: 0.8em;
パンくず
iNoveではデフォルトで表示されていたパンくずですが、Hello :Dでは表示されないのでこれを表示されるように。
Index: single.php
===================================================================
--- single.php (revision 33)
+++ single.php (working copy)
@@ -3,7 +3,7 @@
<div id="leftcolumn">
<?php if (have_posts()) : ?>
-
+ <div style="padding: 0 15px 5px;" class="post_end"><a href="<?php echo get_option('home'); ?>">Home</a> » <?php the_category(', '); ?> » <?php the_title(); ?></div>
<?php while (have_posts()) : the_post(); ?>
<div class="post" id="post-<?php the_ID(); ?>">
<div class="title">
ページメニューの強制大文字化を解除
ヘッダー部分のページメニューで “Apache” というページがなぜか “APACHE” となっていたのでこれを解除。つーか、ユーザが入力したページ名を尊重しようよ。
Index: css/default.css
===================================================================
--- css/default.css (revision 36)
+++ css/default.css (working copy)
@@ -181,7 +181,6 @@
top: 25px;
height: 35px;
margin: 0;
-text-transform: uppercase;
}
投稿内のh3タグをわかりやすく
投稿内で見出しとして使用するh3タグがあまり見出しとしての視認性を発揮していなかったので、サイドバーで使用されている画像をつけるように修正。
@@ -286,6 +291,8 @@
.entry h3 {
font-size: 1.3em;
+background: url(../images/widget_title.png) no-repeat;
+padding-left: 25px;
}
ロードするjQueryのバージョンを変更
header.phpを見てみると、
タグ内で
Google AJAX Libraries API を使ってjQueryをロードしているのですが、jQueryのバージョンが1.2.6なのでこれを1.3にします。
Index: header.php
===================================================================
--- header.php (revision 35)
+++ header.php (working copy)
@@ -11,7 +11,7 @@
<!--[if IE]><link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/css/ie.css" type="text/css" media="screen, projection" /><![endif]-->
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
-<script>
+<script type="text/javascript">
// Load jQuery
- google.load("jquery", "1.2.6");
+ google.load("jquery", "1.3");
</script>
ここを読んでて知ったのですが、Debianではetchからパッケージ管理のフロントエンドとして apt-get じゃなくて aptitude を推奨するようになっていたのですね。依存関係がなくなった時点でパッケージを削除したり、推奨レベルのパッケージを一緒にインストールすることができるのが理由っぽい。
しばらくDebianの情報集めをしていなかったので、すっかり浦島太郎状態です…
SSDの寿命が本当に短いのか実験していないので何とも言えませんが、Ubuntu LinuxでSSDの寿命を延ばすために行なった設定を書いておきます。本当に延びるかは謎です。
swap領域をSSD内に作らない
swap領域をSSDに作ってしまうと、仮想メモリを割り当てる際にSSDに書き込みをしてしまうのでこれは避けましょう。また、/etc/sysctl.conf に以下を追記してOSごと再起動します。(再起動の代わりに sysctl -p で即時に反映することもできます)
この設定をするとswapにページアウトしにくくなります。
OSのキャッシュの書き込みの頻度調整
Ubuntuはデフォルトでは書き込み処理はすべてメモリ上にキャッシュされ、これを5秒に1回ディスクに書き込むという仕組みになっているらしいです。なので、このキャッシュを書き込む頻度を5秒から15秒にします。具体的には /etc/sysctl.conf に以下の行を追加します。
vm.dirty_writeback_centisecs = 1500
設定したら sysctl -p するかOSごと再起動しましょう。
mlocateを行なう頻度を少なく
locateコマンドのデータベースを作成する mlocate はデフォルトでは /etc/cron.daily にあるので1日1回動いてしまいます。これが動くと大量のディスク書き込みが発生するので、locateのデータベースを最新にしなくても良い場合、この mlocate は /etc/cron.weekly にでも移動しておきます。
/tmpはtmpfsに
/tmpは再起動するとどうせ消えるデータなので、SSDへの書き込みを少なくするために tmpfs でマウントするようにします。具体的には /etc/fstab にイカの行を追記して再起動します。
tmpfs /tmp tmpfs defaults,size=512m 0 0
512m(=512MB)となっているところはお好みのサイズにしてください。
mountする際はnoatimeオプションをつける
デフォルトでは読み込みが発生する度にファイルの最終アクセス時刻が更新されてしまいますが、これも寿命を縮めてしまうので、noatimeオプションを導入します。(ただし、アクセス時刻を記録したい場合はこのオプションは導入しないでください)
具体的には /etc/fstab で
UUID=8bac1db5-e2c6-495f-b3ce-7390dea9392a / ext3 relatime,errors=remount-ro 0 1
と relatime となっているところを noatime にします。
UUID=8bac1db5-e2c6-495f-b3ce-7390dea9392a / ext3 noatime,errors=remount-ro 0 1
コメント