MongoDBでゆるふわDB体験

第12回 MongoDBの監視

この記事を読むのに必要な時間:およそ 4 分

はじめに

前回からMongoDBの非機能面に着目していますが,今回はMongoDBの監視について説明します。まず,MongoDBの監視で使うことができる機能やツールを紹介し,その後,これらのツールを用いてどのようにMongoDBを監視するかについて一般的な考え方を紹介します。MongoDBは最新バージョンの2.4を対象としています。

コマンド表記について
$ : コマンドラインで実行するコマンド
> : Mongoシェルで実行するコマンド

監視機能の紹介

ロギング

最初に監視の基本ともいえる,ロギングについて説明します。MongoDBでは何も指定しないと標準出力にログが出力されますが,ファイルに出力する場合は「 --logpath 」オプションにてログの出力先を指定します。

$ mongod --logpath=/var/log/mongodb.log

このままだと,次回起動時にログはローテーションされてしまいます。ログをローテーションせず追記する場合は「--logappend」オプションを用います。

$ mongod --logpath=/var/log/mongodb.log --logappend

ログのレベルは,⁠--verbose」オプションを指定することにより,出力をより多くできます。また,⁠-v」⁠-vv」⁠-vvv」⁠-vvvv」⁠-vvvvv」というオプションもあり,vの数が多いほど詳細に出力されます。逆に「--quiet」オプションを指定すると,最小限の出力になります。

$ mongod --verbose  ←ログ出力を多くする
$ mongod -vvvvv     ←ログ出力を最大限
$ mongod --quiet    ←ログ出力を最小限

リアルタイム監視コマンド

続いて,MongoDBのリアルタイム監視コマンドについて紹介します。次に紹介するコマンドは,mongodが入っているbinディレクトリに入っており,コマンドラインから実行することができます。

コレクションの処理時間順に表示(mongotopコマンド)

mongotopコマンドはtopコマンドのようなコマンドであり,処理に時間がかかっているコレクションを処理時間順に見ることができます。コマンド実行すると,以下のような出力が1秒ごとにひとかたまりずつ出力されます。

mongotopコマンド実行結果(抜粋)

$ mongotop
                      ns       total        read       write              2013-04-17T16:11:44
  sample-db.collection01        13ms         1ms        12ms ←★
  sample-db.collection02        11ms         0ms        11ms
    admin.system.indexes         0ms         0ms         0ms
                       ns       total        read       write              2013-04-17T16:11:45
  sample-db.collection01        16ms         2ms        14ms
  sample-db.collection02        11ms         5ms        11ms
    admin.system.indexes         0ms         0ms         0ms
       (略)

上記の出力結果からは,⁠sample-db.collection01」のコレクションが最も処理時間がかかっており,その中でも書き込みに12ミリ秒費やしていることがわかります。

MongoDB全体の状態を表示(mongostatコマンド)

mongostatコマンドはvmstatのようなコマンドであり,MongoDBサーバ全体のさまざまな統計情報を定期的に表示することができます。コマンドを実行すると以下のような出力が1秒ごとに一行ずつ出力されていきます。

mongostatコマンド実行結果(抜粋)

$ mongostat
insert  query update delete getmore command flushes mapped  vsize    res faults      locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn       time
    *0     *0     *0     *0       0     2|0       0  2.11g  4.51g   946m      0      test:0.0%          0       0|0     0|0   120b     3k     1   01:19:24
    86     *0     *0     *0       0   130|0       0  2.11g  4.51g   974m    132 sample-db:1.8%          0       0|0     0|0    14m    13k     2   01:19:25
   121     *0     *0     *0       0   181|0       0  2.11g  4.51g   994m    181         .:3.2%          0       0|0     0|1    20m    16k     2   01:19:26
   117     *0     *0     *0       0   178|0       0  2.11g  4.51g  1.01g    175         .:3.1%          0       0|0     0|0    20m    16k     2   01:19:27

上記出力では途中から挿入(insertの列)が増加してきて,それに伴い書き込みロックしている割合(locked dbの列)が増加していることがわかります。

統計情報表示メソッド

次に統計情報表示メソッドの説明をします。Mongoシェルでアクセスし,次に紹介するデータベースオブジェクトのメソッドを呼び出すことにより,さまざまな統計情報を表示できます。

MongoDB全体の統計情報(serverStatus()メソッド)

データベースオブジェクトのserverStatus()メソッドを用いることで,MongoDBのサーバの統計情報を詳細に表示することができます。このコマンドは非常に多くの統計情報を出すことができます。たとえば,ページフォルト,B-treeのアクセスレート,開いている接続数,挿入や更新,クエリ,削除の合計数などが含まれます。

serverStatus()メソッド実行結果(抜粋)

> db.serverStatus()
{
        "host" : "mongodb.localdomain",
        "version" : "2.4.1",
        "process" : "mongod",
        "pid" : 1537,
        "mem" : {
                "bits" : 64,
                "resident" : 725,        ←物理メモリ使用量
                "virtual" : 2568,        ←仮想メモリ使用量
                "supported" : true,
                "mapped" : 1136,
                "mappedWithJournal" : 2272
        }

上記の出力結果から,MongoDBの物理メモリ使用量が725MBであり,仮想メモリ使用量が2568MBであることがわかります。

データベースの統計情報(データベースのstats()メソッド)

データベースオブジェクトのstats()メソッドを用いることで,データベースの統計情報を表示することができます。

データベースのstats()メソッド実行結果(抜粋)

> db.stats()
{
        "db" : "sample-db",
        "collections" : 3,        ←コレクション数
        "dataSize" : 1447258292,  ←データサイズ
        "indexSize" : 408800,
        (略)
}

上記の出力結果から,コレクション数が3で,データのサイズが1447258292Byteであることがわかります。

コレクションの統計情報(コレクションのstats()メソッド)

データベースのstats()コマンドと同様に,コレクションのstats()メソッドを用いることで,そのコレクションの統計情報を表示できます。

コレクションのstats()メソッド実行結果(抜粋)

> db.(コレクション名).stats()
{
        "ns" : "sample-db.collection01",
        "count" : 8031,
        "size" : 1447258112,
        "totalIndexSize" : 408800,
        (略)
}
実行中のクエリの情報取得(currentOp()メソッド)

currentOp()メソッドは,そのデータベースで実行中のオペレーションを表示できます。

currentOp()メソッド実行結果(抜粋)

> db.currentOp();
{
        "inprog" : [
                {
                        "opid" : 22991,
                        "op" : "insert",
                        "ns" : "sample-db.test",
                        "lockStats" : {
                                "timeLockedMicros" : {
                                        "r" : NumberLong(0),
                                        "w" : NumberLong(138) ←書き込みロックが138ms
                                },
                        (略)

上記の出力結果では,insertにおいて,書き込みロックが138ミリ秒発生していることがわかります。

詳細な使い方

この章で紹介したコマンドやメソッドの詳細な使い方は,以下の公式HPへのリンクを参照してください。

著者プロフィール

藤崎祥見(ふじさきしょうけん)

野村総合研究所 OpenStandia所属。オープンソースのR&Dとセミナー講師を担当。

Debian,Ubuntu,Liferayのコミュニティで活動した後,MongoDBの翻訳に関わり,丸の内MongoDB勉強会を始める。

実家がお寺で,住職の資格を所持する坊主系エンジニア。

Twitter:@syokenz


渡部徹太郎(わたなべてつたろう)

野村総合研究所 OpenStandia所属。オープンソースを使ったSIやサポートの業務に従事。

藤崎と共同で丸の内MongoDB勉強会を始める。

趣味は自宅サーバ。好きなものはLinuxとRuby。

Twitter:@fetarodc


林田敦(はやしだあつし)

野村総合研究所 OpenStandia所属。オープンソースを使ったSIや製品開発業務に従事。

丸の内MongoDB勉強会では広報兼雑用係を務める。

趣味はレザークラフト,ダイビング,スキー,キャンプ,ジェットスキー,カメラ等々。作って滑って撮って潜れるエンジニア。

Facebook:Atsushi Hayashida

コメント

コメントの記入