DTraceでトラブルシューティングOpenSolarisで始めるブログサーバ構築(最終回)(1/4 ページ)

この連載では、サーバOSとして十数年発展してきた「Solaris」をオープンソース化した「OpenSolaris」を紹介し、ブログサーバ「Roller」と組み合わせて運用していくうえで有用なさまざまな知識を紹介していきます。(編集部)

» 2008年08月06日 00時00分 公開
[原口章司サン・マイクロシステムズ株式会社]

 前回「シングルノードで手軽にクラスタを試す」までの連載で、OpenSolarisの機能や特徴を紹介しながら、ブログサーバを構築する方法を解説してきました。Solarisコンテナ、ZFS、Open HAクラスタを使い、予期されるさまざまな障害に備える強固なサーバ構築のノウハウをご理解できたと思います。

 最終回の今回は、ブログサーバ運用中にシステムの状態を監視したり、発生したシステム障害や不具合の原因究明に有効となるDTrace(動的トレース)を紹介します。

DTraceの概要

 システムが障害を起こしてクラッシュしたときや、アプリケーションが異常終了しコア・ダンプした場合は、そのダンプファイルから、クラッシュや異常終了直前の状態を解析することができます。

 しかし、このような致命的な状態になる前、例えば稼働中のあるドライバやアプリケーションから応答がなかったり、CPUの稼働率やメモリの使用量が予想以上に高い場合などに、システムでいま何が起きて、どのような状態にあるのかをリアルタイムに知りたいこともあります。DTraceは、このような状況でのトレースに特に有効です。

 OpenSolarisでは、カーネルをはじめとするあらゆる個所に「Probe(プローブ)」と呼ばれる計測ポイントが実装されています。実装されているProbeの数は、小さいシステムでも約3万カ所、筆者のSXDE 1/08 x86ノートPCの環境では、実に5万8400カ所の計測ポイントが実装されています。

 これらの計測ポイントは、通常「計測用の窓」が閉じた状態(Probe=オフ)であり、稼働中のシステムやアプリケーションへのオーバヘッドはほとんどありません。

 トレースのためにいったんDTraceが稼働すると、計測したいポイントの「計測用の窓」が開き(Probe=オン)、カーネルで使用されている構造体や関数の出入り口での情報など、さまざまな情報をこの計測ポイントから取得できます。このオンとオフが動的に切り替えられるため、システムやアプリケーションを再起動する必要はありません。

 DTraceはセキュリティやプライバシーを考慮し、デフォルトではルート権限でのみ実行可能です。サーバシステムの特定の管理者やPC上で個人で使う場合など、ユーザーモードでDTraceを使う場合には、/etc/user_attrファイルの中でDTrace使用の特権を与えます。

図1 図1 DTraceのアーキテクチャ

 またDTraceには、Probeを動的に起動し、情報収集や処理を行うスクリプト言語(Dスクリプト)が含まれています。

 本稿では、DTraceの基本的な使用方法についての説明は省略します。DTraceやDスクリプト言語の詳細については、「Solaris動的トレースガイド」をご覧ください。またサンのDTraceの紹介サイトも参考になると思います。

DTraceによるブログサーバのモニタリング

 では、DTraceを使って、今回の連載で構築したブログサーバをモニタリングしてみましょう。今回のブログサーバ構築例では、2つのローカルゾーンが大域ゾーン上で稼働しています。

図2 図2 ブログサーバのモニタリング
solaris# zoneadm list -vc
ID NAME            STATUS  PATH                     BRAND  IP
0 global           running /                        native shared
1 tomcat_zone      running /pool/zones/tomcat_zone  native shared
2 mysql_zone       running /pool/zones/mysql_zone   native shared

 Solarisコンテナを使用したシステムの場合、ローカルゾーン内のDTraceによるトレースは、大域ゾーン上のスーパーユーザーでのみ可能です。dtrace(1M)コマンドを使って、ぞれぞれのローカルゾーンのシステムコール呼び出しのカウントを計測してみます。

solaris# dtrace -n 'syscall:::entry { @[zonename]=count(); }'
dtrace: description 'syscall:::entry ' matched 235 probes
^C   ←数秒後 "Ctrl-C"を入力します
mysql_zone                                    173
tomcat_zone                                   255
global                                       7423
solaris#

 次に、tomcat_zoneで実行中のプログラムのシステムコール呼び出しのカウントを計測してみます。

solaris# dtrace -n 'syscall:::entry /zonename == "tomcat_zone"/ { @[execname]=count(); }'
dtrace: script 'tomcat_zone.d' matched 235 probes
^C   ←数秒後 "Ctrl-C"を入力します
snmpd                                           1
svc.configd                                     1
svc.startd                                      1
java                                          232
solaris#

 稼働中のApache RollerはすべてJavaで書かれており、トレースするにはtomcat_zoneで実行中のjavaプロセスをトレースします。DTraceには、Javaのスタック・トレース用にjstack()アクションが用意されていますので、まずはこれを使ってみましょう。

dtrace -n 'syscall::write:entry /zonename == "tomcat_zone" && execname == "java"/ { jstack(); }'

 この例では、tomcat_zoneでシステムコールwrite()関数が呼ばれたときのJavaのスタック・トレースが表示されます。今回の例では、tomcat_zoneはApache Roller専用のコンテナですので、Rollerユーザーの誰かが新規のエントリを投稿したり、読者の誰かがコメントを投稿したときなど、システムへの書き込み処理が行われたときだけに下記のようなトレースを表示します。

...
1 78111 write:entry
     libc.so.1`__write+0x15
     libjvm.so`__1cDhpiFwrite6FipkvI_I_+0xa0
     libjvm.so`JVM_Write+0x36
     libjava.so`writeBytes+0x154
     libjava.so`Java_java_io_RandomAccessFile_writeBytes+0x3f
     java/io/RandomAccessFile.writeBytes([BII)V
     java/io/RandomAccessFile.write([BII)V
     org/apache/lucene/store/FSOutputStream.flushBuffer([BI)V
     org/apache/lucene/store/OutputStream.flush()V
     org/apache/lucene/store/OutputStream.close()V
...

       1|2|3|4 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。