THREAD [009F:00BE-0012] WAITING FOR RWSEM 0x4245 open database queue semaphore (@01070246) (R=0,W=1,WRITER=009F:00AF-0025,1STREADER=009F:00AF-0025) FOR 5000 ms
この文章の中で用いられる用語は、プロセスやスレッドのアーキテクチャーを持ったプラットフォーム(Windows
NT、UNIX、OS/2 )にのみ適用されます。プロセス ID はドミノのアドイン・タスク、あるいはドミノのサーバー・タスクと対応しています。タスクの殆どがマルチスレッドで動作しているため、複数のスレッドが一つのプロセスと結びついています。プロセスをサポートしていても、スレッドをサポートしていないプラットフォーム
( Netware や Windows 95/98の場合)は、セマフォーの扱いは若干異なります。
009F は、セマフォーを要求したプロセスを示しています。009Fは抜粋した形であり、それに対応するレコードが実際のプロセス
ID となります。この ID は、他のプロセスがセマフォーを設定している可能性がある状況下で、さらにセマフォーをロックしようとしているプロセス名を示しています。
[009F:00BE-0012]
00BE は仮想スレッド ID を示しています。00BE は抜粋した形であり、それに対応するレコードが実際の仮想スレッド
ID となります。この値はドミノ内部で使われているもので、実行中のスレッドを示すものです。
[009F:00BE-0012]
0012 は OS が理解できるスレッド ID を示しています。この情報は今後のデバッグの作業を行う上で重要となるもので、カスタマー・サポートでトラブルシューティングをする上で必要となってくるものです。物理的なスレッド情報表示は、R5
で取り入れられたスレッド・プール・アーキテクチャーの改良により可能になりました。
009F:00AF
009F は、セマフォーを最後にロックしたプロセスを示しています。AF は、仮想スレッド
ID を示しています。
Show Stat Sem.Timeouts
ドミノ サーバーが起動してから発生した、Sem.Timeouts の回数とタイプを表示します。
Show Stat Server.Users
現時点でのアクティブなユーザー数を表示します。
Show Stat Database.DbCache.AverageDbOpenTime
ユーザーからの要求、あるいはサーバー自身からの要求に対して、データベースを開くのに要した平均時間を秒単位で表示します。
Show Tasks
サーバーの状態と現在起動しているタスクの状況と動作内容について表示します。
Show Perf
日時とトランザクションの数、現在アクティブなユーザー数を1分間隔で継続的に表示します。
Show Dbs
データベースのパフォーマンスに関する情報が表示されます。例えば、データベースがオープンされた回数、データベースへの書き込み回数、データベースがロックされていたためにユーザーが待った回数などが表示されます。ちなみに、このコマンドは
R5 で新たに加わったものです。
様々なツールを利用する
以下に示すツールを使ってアクティブなプロセスやアクティビティー・レベル、スレッド
ID の値を取得できます。先ほど示したセマフォー・メッセージで示されたプロセス情報を手掛りにして、以下に示すツールのアウトプットから問題のプロセスを特定できます。
Perfmon
Windows NT プラットフォームでは Perfmon を使用すると、OS 乃びドミノのコンポーネントのパフォーマンスに関する情報を収集できます。特に、プロセスの統計情報を介して各アドイン・タスクについてアクティビティーの動作レベルを確認できます。
Windows NT のタスク・マネージャー
このツールを使用すると、各タスクのプロセス ID を識別できます。ID を確認するには、プロセスのタブをクリックしてイメージ名の列に表示されるプロセス名
(イメージ名の列に表示) とプロセスID (PIDの列に表示) から読み取ります。セマフォー・タイムアウト・メッセージの中で記されたプロセス
ID をタスク・マネージャーで表示される ID と照合すると、タスク名を確認できます。詳細に関しては、Lotus
Customer Support Techote #175384 How To Utilize SEMDEBUG.TXT and Task Managerをご覧ください。
Qslice
Windows NT のプラットフォームの場合は、このツールを使って、その時点でのアクティブなタスクを表示さできます。ここでは、プロセス
ID とそのプロセスの中で動作している物理スレッド ID を表示します。
サーバー・コンソールへのアウトプットをキャプチャーしてファイルへ出力します。この際、DEBUG_THREADID
と併せて使用します。この内容から、メッセージとプロセスやスレッド ID を特定できます。この機能は、ディスク・スペースと
CPU パワーを消費しますので、必要のない時には「無効」にしてください。さらに詳細な情報に関しては次をご覧ください。Lotus
Customer Support Technote #162400、 How Should the DEBUG_OUTFILE Parameter
Be Implemented?(US)
ドミノ・ログ・ファイルから読取る
セマフォーの挙動について調査を行なうにあたって、最初にあたるべきものはドミノのログ・ファイルです。ログ・ファイルにはドミノ
サーバー・コンソールに出力された内容が記録されています。特に、Show Stat Server.Users や Show Stat Sem.Timeouts を打ち込むと一定時間内に起きたアクティビティーも記録されますので手掛りとなります。
DEBUG_THREADID で得られる内容を確認する
ドミノのログ・ファイルでは、DEBUG_THREADID から得られる出力を見て、DEBUG_OUTFILE
ファイルのメッセージとプロセスIDやスレッドIDを関連づけを行えます。それにはDEBUG_THREADID
から OS のプロセスとその ID を特定する必要があります。プロセス ID の詳細については、「トラブルシューティング - 情報の収集」のセクションをご覧ください。
Show Tasks コマンドを実行するとアドイン・タスク名の横にステータスを示すコメントが出てきます。これから、そのタスクが現在どのような状態にあるか、どのような動作をしているかを確認できます。タスクが止まったと思われる時に、一定の時間ごとにこのコマンドを発行した際に、ステータスの変化がないものは、本当にタスクが止まってしまったと判断できます。但し、非常に大きなビューを再構築する場合などでは該当しないことがあります。そのため、それぞれのシステムの構成や動作の傾向を知っておくと原因の誤認を防げます。