Firebird Documentation Index → Firebird 2.5 リリースノート → 管理機能 → モニタリングの改善 |
Firebird 2.5では、バージョン2.1で導入された“MON$”データベースモニタリング機能が拡張され、コンテキスト変数とODS 11.2以降のデータベースでのメモリ使用に関するデータを通知する新たなテーブルが備わりました。また、これらのデータベースでは、クライアントの接続をMON$ストラクチャーを通じて他の接続から終了できるようになりました。
もともとの設計では、特別な権限を持たないデータベースのユーザーは自身のCURRENT_CONNECTIONに関するモニタリング情報しか見ることができませんでした。現在は、同じユーザー名で認証された任意のアタッチメントの情報をリクエストできるようになっています。
トラッカー・リファレンス CORE-2233
異なるエンドユーザーのためにミドルウェア層で同じユーザー名による同時・複数回のログインを必要とするアプリケーションのアーキテクチャでは、エンドユーザーにモニタリング機能を公開する点について、パフォーマンスやプライバシーへの影響が考慮されるべきです。
同様の拡張はバージョン2.1.2で実装されました。
ODS 11.1のメタデータについては、バージョン2.1用のドキュメントを参照して下さい。
ファイル仕様に関するMON$テーブル内のカラム定義に使われるシステムドメインRDB$FILE_NAME2が、CHARACTER SET NONEからCHARACTER SET UNICODE_FSSへと変更されました。現在影響を受けるカラムはMON$DATABASE_NAMEとMON$ATTACHMENT_NAMEとMON$REMOTE_PROCESSです。この変更で影響を受けるデータは、バージョン2.5で更新されたfilespecの取り扱い、および他のDPBのキャラクタパラメータ・アイテムと一致することになります。
(トラッカー・エントリー:CORE-2551、A. dos Santos Fernandes)
- MON$STAT_ID(統計 ID)
- MON$STAT_GROUP(統計グループ)
0: データベース
1: アタッチメント
2: トランザクション
3: SQL文
4: 呼び出し
- MON$MEMORY_USED(現在使用中のバイト数)
エンジンによって実行されるプールからの高レベルでのメモリ割り当て。
Can be useful for tracing memory leaks and for investigating unusual
memory consumption and the attachments, procedures, etc. that might
be responsible for it.
メモリリークのトレース、また、それが原因となりうる異常なメモリ消費やアタッチメント、プロシージャなどの調査に役立つ可能性があります。
- MON$MEMORY_ALLOCATED(OSレベルで現在割り当てられているバイト数)
Firebirdメモリマネージャによって実行された低レベルでのメモリ割り当て。
これらはOSによって実際に割り当てられているバイトであり、そのため、
物理メモリの消費を監視することができます。
すべてのレコードがゼロ以外の値を持つわけではありません。一般に、MON$DATABASEとメモリバインド・オブジェクトだけはゼロ以外の“割り当てられた”値を示します。小さな割り当てはこのレベルでは行われません。その代わり、データベースのメモリプールにリダイレクトされます。
- MON$MAX_MEMORY_USED(このオブジェクトで使用される最大のバイト数)
- MON$MAX_MEMORY_ALLOCATED(このオブジェクトによってOSから割り当てられた最大のバイト数)
- MON$ATTACHMENT_ID(アタッチメント ID)
セッションレベルのコンテキスト変数用の有効なIDのみを含みます。
トランザクションレベルの変数はこのフィールドにNULLをセットします。
- MON$TRANSACTION_ID(トランザクション ID)
トランザクションレベルのコンテキスト変数用の有効なIDのみを含みます。
セッションレベルの変数はこのフィールドにNULLをセットします。
- MON$VARIABLE_NAME(コンテキスト変数名)
- MON$VARIABLE_VALUE(コンテキスト変数値)
MON$STATEMENTSとMON$STATEでのメモリ使用の統計は、実際のCPU消費を表現しています。
トラッカー・リファレンス CORE-1583
例
SQL文のメモリ使用ランキング“トップ10”:
SELECT FIRST 10 STMT.MON$ATTACHMENT_ID, STMT.MON$SQL_TEXT, MEM.MON$MEMORY_USED FROM MON$MEMORY_USAGE MEM NATURAL JOIN MON$STATEMENTS STMT ORDER BY MEM.MON$MEMORY_USED DESC
現在の接続用の全てのセッションレベルのコンテキスト変数を列挙:
SELECT VAR.MON$VARIABLE_NAME, VAR.MON$VARIABLE_VALUE FROM MON$CONTEXT_VARIABLES VAR WHERE VAR.MON$ATTACHMENT_ID = CURRENT_CONNECTION
MON$ストラクチャーは、設計上、読み取り専用となっています。そのため、それらに対するユーザーDMLオペレーションは禁止されています。しかし、MON$STATEMENTSとMON$ATTACHMENTSテーブルのレコードの削除(だけ)を許可する仕組みが組み込まれています。このメカニズムの効果として、それぞれ、SQL文実行のキャンセルや、ODS 11.2データベース向けには、クライアントセッションの終了が可能になります。
指定された接続の現在の全活動をキャンセルする:
DELETE FROM MON$STATEMENTS WHERE MON$ATTACHMENT_ID = 32
“自分”以外の全てのクライアントの接続を切断する:
DELETE FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID <> CURRENT_CONNECTION
SQL文をキャンセルしようとしても、クライアントに現在実行中のSQL文がない場合は、無効なオペレーション(“no-op”)となります。
キャンセルと同時に、execute/fetchのAPI呼び出しはエラーコードisc_cancelledを返します。
その後のオペレーションは許可されます。
終了中の接続でアクティブなトランザクションはすぐにキャンセルされ、ロールバックされます。
終了されると、クライアントセッションはエラーコードisc_att_shutdownを受け取ります。
その後にこの接続ハンドルを使おうとすると、ネットワークのread/writeエラーを引き起こします。
Firebird Documentation Index → Firebird 2.5 リリースノート → 管理機能 → モニタリングの改善 |