MongoDBが遅いときの切り分け方法

Tetsutaro Watanabe
Tetsutaro Watanabe★最近のスライドはSpeaker Deckにも同じものがあります★
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
MongoDBが遅いときの切り分け方法
コンサルタント
渡部 徹太郎
1
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
自己紹介
2
{"ID" :"fetaro"
"名前":"渡部 徹太郎"
"研究":"東京工業大学でデータベースと情報検索の研究
(@日本データベース学会)"
"仕事":{前職:["証券会社のオンライントレードシステムのWeb基盤",
"オープンソースなら何でも。主にMongoDB,NoSQL"],
現職:["大手Web企業の横断分析基盤,Exadata,Hortonworks,EMR"]
副業:["MongoDBコンサルタント" ]}
"エディタ":"emacs派",
"趣味": ["自宅サーバ","麻雀"]
}
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
はじめに
MongoDBは速い?
• MongoDBはNoSQLだからRDBより速い?
• シャーディングすれば単体構成より速い?
3
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
はじめに
MongoDBは速い?→ケースに依る
• MongoDBはNoSQLだからRDBより速い わけではない
– RDBとは提供している機能が違う
• トランザクション、JOIN、副問合せ等のRDBで遅くなりがちな
複雑なクエリはMongoDBは提供していない
• データモデルが違う、保証する整合性が違う
– シンプルなクエリであればRDBとMongoDBでそれほど差はな
い
• MongoDBはオーバーヘッドが少ない分速いが
• 結局はディスクIOをどれだけ減らせるか
• シャーディングすれば単体構成より速い とは限らない
– ボトルネックが分散するようにシャーディングを組まないとい
けない
– データだけ分散しても駄目。クエリの分散まで考える必要あり
– クエリが分散してもボトルネックが解消しないと駄目。
• 例)ネットワークネックならばIOが減っても意味なし
4
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
はじめに
MongoDBを速くしたければRDBを勉強すべき
• MongoDBだから特別なことはほとんどない
• MongoDBはRDBに似ている
– CassandraやDynamoDB 等はRDBと大きく違う
• 8割はRDBのパフォーマンスチューニングの知識でカバーで
きる
– インデックス、クエリ最適化、キャッシュ、データ圧縮、WAL、
リードレプリカ、パーティショニング
• 残り2割はMongoDB特有
– データ構造(JSON)が性能に与える影響
– シャーディング
今回の発表は、RDBにも通用する一般的な話が多いです
5
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
アジェンダ
• 性能問題との向き合い方
• 解くべき問題の明確化
• 根本原因の特定
• IOボトルネックの解消
– MMAPv1の場合
– WiredTigerの場合
6
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
性能問題との向き合い方
7
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
性能問題を考える場合の思考順序
1. 解くべき問題の明確化
– 本当にMongoDBが遅いのか?
• アプリやネットワークに問題はないか
– どのクエリが遅いのか?
• 読み込み, 書き込み, 集計
– 何を改善したいのか(性能要件の明確化)
• レスポンスタイム,スループット
2. 根本原因の特定
– リソースが枯渇しているのか?
• CPU, メモリ/ディスク, NW帯域
– 非効率な処理をしていないか?
• ロック開放待ち、フェッチ、NWラウンドトリップ
3. 根本原因の解消
– リソース枯渇の場合
1. 単体構成の性能を最大限まで上げる→ 8割これでいける!
2. リードレプリカ→おまけ
3. シャーディング→最後の手段
– 処理が非効率の場合
• アプリを見直す
8
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
性能問題調査でよくある間違い
• よくある勘違い
– CPU使用率が高すぎることが原因だ!
• →いいことです
– メモリ使用率が高すぎることが原因だ!
• →溢れてIOが発生していなければ、いいことです
• 全てのリソースを最大限まで使えたら完璧なチューニング
• つまり
– CPU使用率100%
– メモリ使用率100%
– ディスクI/O使用率100%
– NW使用率100%
を同時に見対している状態
9
考え方の整理はこの本がおすすめ
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
解くべき問題の明確化
10
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
本当にMongoDBが遅いのか?
• 「画面の応答が遅い」「アプリの実行時間がながい」
→本当にMongoDBが遅いんですか?
• ミドルウェアのログから各レイヤでの処理時間を計測
– 大多数のケースで、これが整理できていない
11
ブラウザ Webアプリ MongoDB
t0
t1
t2
t3
t4
t5
t6
本当にココ
が遅いの
か?
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
MongoDBの何が遅いのか
• 何のクエリが遅いのか?
– 読み取り、書き込み、集計
– 可能であればクエリを特定する
• 何の指標が遅いのか?
– レスポンスタイムが遅い
• スロークエリログを見てクエリ応答時間をみる
• プロファイラを有効にしてクエリの情報を見る
– スループットが低い
• mongostatを見て、単位時間あたりの処理量をみる
• mongotopを見て、コレクションごとの処理量をみる
12
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
遅い箇所の調べ方
• スロークエリログ
– 設定ファイルで起動前に指定する
– デフォルトで100msを超えるクエリは、ログに出力される
• プロファイラ
– 起動後にMongoShellなどで接続して一時的にプロファイラを有効
にする
13
2015-07-10T04:09:01.113+0900 I COMMAND [conn1] command test.$cmd command: insert
{ insert: "mycol", documents: [ { _id: ObjectId('559ec6cd959e8f181ae68153'), name:
"watanabe" } ], ordered: true } keyUpdates:0 writeConflicts:0 numYields:0
reslen:40 locks:{ Global: { acquireCount: { r: 2, w: 2 } }, Database:
{ acquireCount: { w: 2 } }, Collection: { acquireCount: { w: 2 } } } 120ms
#プロファイラを有効にする
> db.setProfilingLevel(1) { "was" : 0, "slowms" : 100, "ok" : 1 }
#中身を見る
> db.system.profile.find()
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
遅い箇所の調べ方
• mongostatコマンド
• mongotopコマンド
14
$./bin/mongostat connected to: 127.0.0.1
insert query update delete getmore command flushes mapped vsize res ...
40 *0 *0 *0 0 1|0 1 12g 24.4g 51m ...
30 *0 *0 *0 0 1|0 0 12g 24.4g 52m ...
32 *0 *0 *0 0 1|0 0 12g 24.4g 53m ...
$ ./bin/mongotop
ns total read write 2015-07-10T04:56:52+09:00
mydb.mycol 6ms 6ms 0ms
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
ns total read write 2015-07-10T04:56:53+09:00
mydb.mycol 44ms 44ms 0ms
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
遅い箇所の調べ方
• MongoDB CloudManager(旧OpsManager, MMS)を使って
も良い
– あらかじめMongoDBに特化したメトリックがとられる
– 監視項目を設計しなくて良い
15
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
根本原因の特定
16
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
根本原因の特定
• 結論は2種類
– ボトルネックが有る
or
– ボトルネックが無い
• ボトルネックが有る
– CPU 1core張り付き、高ロードアベレージ→1.CPUボトルネック
– メモリ空き容量0、ディスクIO頻発→2.IOボトルネック
– ネットワーク流量 逼迫(80%超え) →3.NWボトルネック
• ボトルネックがない
– MongoDBに本気を出させることが出来ていない→4.処理の非効率
17
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
根本原因の特定
1.CPUボトルネック
• 概要
– Aggregationや算術演算で、CPUを使う処理が多い場合にボトルネックになるこ
とがある。
– CPUボトルネックはIOやネットワークにボトルネックがない場合がおおいため、
どちらかといえば健全な状態。
• チェック方法
– 1コアに注目したとき、使用率のuserとsysの合計が100%になっていないか
• 全体のCPU使用率50%、25%、12.5%は要注意
– 50%→2core中1つが100%
– 25%→4core中1つが100%
– 12.5%→8core中1つが100%
• 例 ) $ dstat -c -C 0,1,2,3,total
– ロードアベレージはコア数以上になっていないか
• 解消方法
– 応答性能向上
• マルチスレッドで動作する演算ならばコア数を上げる
• そうでないならCPUクロック数を上げる
– スループット向上
• コア数を上げる
18
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
根本原因の特定
2.ネットワークボトルネック
• 概要
– アプリケーションに対してMongoDBが大量のデータを返す場合に
多い。
– 他には、レプリケーションのoplog転送量が想定以上に肥大化し、
ネットワークを圧迫している場合もある
• チェック方法
– mongostatやOSのdstatコマンドにより、ネットワークの流量を監
視し、ネットワークのキャパシティ(1Gbit, 10GBit等)に対して流
れている流量が限界に達していないか?
– 1Gbit/sの設定であれば800Mbit/sあたりで限界
• 解消方法
– ネットワークを太くする
– 射影してアプリケーションで受け取るデータを減らす
– oplogが肥大化が原因の場合は、肥大化を引き起こすオペレーショ
ンに注意する
• multi updateやremove、配列の$popや$pullなど
詳細は https://enterprisezine.jp/dbonline/detail/8095
19
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
根本原因の特定
3.IOボトルネック
• 概要
– メモリ上にデータがなく、ディスクにデータを読みに行くことが頻発
すると、ディスクはメモリに対して100倍程度遅いため、全体として処
理速度が低下する。
– MongoDB(というかDB全般)では大半がこのケース
• チェック方法
– OSのiostatコマンドで、 avgqusz, await, %util が高い。 rMB/s、
wMB/sがいつもより多い。CPUのiowaitが多い
– キャッシュが溢れている
• MMAPv1の場合、mongostatのページフォルトが多い
• WiredTigerの場合、キャッシュへの読み込み累積値(bytes read into
cache)が物理メモリ量を超えて増え続けている
• 解消方法
– 次ページで説明
20
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
根本原因の特定
3.IOボトルネック - 解消方法
1. インデックス
– RDBと同じB-Treeでインデックスがあるので、同じ考え方でインデックスを設
計すれば良い
– 実行計画の見方
• db.mycol.find().explain() →実行はしないで計画を表示
• db.mycol.find().explain("executionStats") →実際に実行する
2. メモリキャッシュ
– メモリを駆使してIOボトルネックを解消するには
MongoDBのアーキテクチャの理解が必須
– ストレージエンジンによって全く違う
• MMAPv1 : メモリ管理をOSまかせ
• WiredTiger : MongoDBが買収した最先端のストレージ
– →後半でガッツリ説明
21
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
根本原因の特定
4. 処理の非効率
• 書き込みが遅い
– ロック開放待ちになっている(MMAP限定)
– バッチインサートしていない
– Write Concernの値が必要以上に大きい
– WiredTigerの場合は同時に実行できるクエリ数にそれぞれ128
の制限(Ticketsという)があり、それに引っかかっていないか
• db.serverStatus().wiredTiger.concurrentTransactions
• 読み込みが遅い
– フェッチが細かすぎる
– 同時実行
– 同時実行クエリ数制限
22
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
IOボトルネックの解消
MMAPv1の場合
23
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
読み込み時の動き(MMAP)
• 起動時に、mongodは、OSに対して、
データベースファイルをメモリにmapするように依頼する
– システムコールmmap()を実行
• 起動直後はメモリは空
24
doc1 doc3index doc2
ディスク
メモリ
mongodプロセス
OSが管理
ブロック
データベースファイル
mmap(
)
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
読み込み時の動き(MMAP)
• mongodがdoc1を読もうとすると
– mongodは、OSに対して、ブロックの取得を依頼
– OSは、メモリ上にないので、ディスクから読む(=遅い)
• ページフォルト発生
• doc1と関連するindexのブロックだけが読み込まれる
25
doc1 doc3index doc2
ディスク
メモリ
doc1
mongodプロセス
index
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
読み込み時の動き(MMAP)
• doc1をもう一度読む
– mogodは、OSに対して、ブロックの取得を依頼
– OSは、メモリにあるので、メモリから返す応答する(=速い)
26
doc1 doc3index doc2
ディスク
メモリ
doc1
mongodプロセス
index
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
読み込み時の動き(MMAP)
• doc2を読むと
– indexはメモリにあるが、doc2はメモリにないので、ディスク
から読む(遅い)
27
doc1 doc3index doc2
ディスク
メモリ
doc1
mongodプロセス
doc2index
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
読み込み時の動き(MMAP)
• doc3を読むと
– doc3はメモリにないので、ディスクから読む
– 空きがないので、最もアクセス頻度の低いブロックを追い出す(ス
ワップアウト)
28
doc1 doc3index doc2
ディスク
メモリ
mongodプロセス
index doc3
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
MMAPで、IOネックで、読み込みが遅いときの原因候補
• インデックス
– インデックスが使われていない
– インデックスが有効ではない
• フルスキャンの方が効率が良い
• hint()の利用を検討
• キャッシュ
– 起動直後でキャッシュが空
– ワーキングセット(インデックスと使うデータ)がメモリに対して大す
ぎる
– OSにメモリの空きがなく、mongodがメモリをもらえていない
– 射影してもメモリにはドキュメント全体がのるが、その動きを知らない
• db.mycol.find({},{"name":1}) としてもname以外のデータもメモリに
乗る
– ブロックサイズがドキュメントに対して大きすぎて無駄が多い
29
doc1 無駄
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
書き込み時の動き(MMAP)ジャーナルなし
• update doc1を実行すると
– mongodは、OSに対して、データベース単位のロックを依頼して更新
• MongoDB 3.0ではコレクションレベルでロック
– 他のスレッドからの書き込みは待たされる(=遅くなる)
– メモリ上にindexとdoc1があればメモリ上で更新は完結。なければIO発生
– 非同期でディスクに書き戻し(60秒に一回)
• クラッシュすると最悪60秒間ロストする&データベースファイルが破損する
30
doc1 doc3index doc2
ディスク
メモリmongodプロセス
doc2index'
スレッド スレッド
書き込みを待たされる2.ロック・
doc1とindexを更
新 ×
1.アプリからクエリ4.アプリに返却
ロック開放
5.60秒に1回ディスクに書き戻し
fsync()
doc1'
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
書き込み時の動き(MMAP)ジャーナルあり
• update doc1
– ジャーナルファイルに更新内容を記載
• クラッシュしても100ms以内の変更は保持
• クラッシュしてもデータ破損自動修復
31
doc1 doc3index doc2
ディスク
メモリmongodプロセス
doc2
スレッド
2.ロックを取得
更新内容を追記
ジャーナル
ジャーナル
5.100msに1回flash
(j:trueなら即時)
4.アプリに返却
ロックを開放
1.アプリからクエリ
3. doc1とindexを
更新
6.60秒に1回ディス
クに書き戻し
doc1'index'
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
MMAPで、IOネックで、書き込みが遅いときの原因候補
• インデックス
– インデックスがある
• キャッシュ
– 更新するドキュメント・インデックスがメモリに無い
– ジャーナルとデータを同じディスクい書いている
– 全てのデータベースが同じディスクに書いている
– MongoDBのログをデータと同じディスクに書いている
– Write concertnで j:trueになっていてジャーナルの物理書き込みを待って
いる
– ドキュメントのサイズが大きくなり、物理移動が発生している
• 肥大化が起こると、そのコレクションでは、次からドキュメントサイズに余裕を
持って物理領域を取るようになる→Padding factorの増加
– データ移動が頻発し、データファイルがフラグメンテーションして、必要
以上にメモリを利用しなくてはならない
32
doc1 doc3index doc2
doc3index doc2 doc1'
doc1index doc2 doc3
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
IOボトルネックの解消
WiredTigerの場合
33
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
WiredTigerの基本
• WiredTigerとは
– MongoDB,Incが買収したストレージ
– MMAPv1を差し替えることができる
• MMAPv1との違い
– OS任せだったメモリキャッシュを、ある程度制御するようになっ
た
– 更新は、その場(in place)ではなく、新しいバージョンのドキュメ
ントを挿入して、ポインタを張り替えようになった(MVCC,CAS)
• ロックが無くなった(事実上ドキュメントレベルロックと同じ)
• データファイルのフラグメンテーションがなくなった
• データの肥大化による移動がなくなった
• 裏で、古いバージョンをマージする動作(eviction)をするようになった
• これらにより、複数スレッドでマルチコアを有効に使って、スルー
プットをあげられるようになった
– インデックスとデータが別ファイルになった
– データの圧縮ができるようになった(メモリ量は圧縮できない)
34
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き(たぶん正しい)
• 起動直後はWiredTigerキャッシュは空
35
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
dirtyページ
cleanページ
on diskページ
root
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き(たぶん正しい)
• 読み込むとツリーが形成される
• ツリーのリーフはディスクのページ毎に読み込まれている
• 以下の例ではdoc1を読んでいるので、indexとdocが含まれるページがキャッシュにのる
36
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
dirtyページ
cleanページ
on diskページ
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き(たぶん正しい)
• さらにdoc2やdoc3を読むと、キャッシュにのる
37
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
doc
3
doc2 dirtyページ
cleanページ
on diskページ
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き(たぶん正しい)
• ここでトランザクションtx1でdoc1をdoc1'に更新しようとする
(説明を簡単にするため、index更新は図から省略)
– これは新しいツリーをつくる動きになる
• それとは別に、メモリ上のジャーナルに更新内容を書き込む
– 50ms毎にディスクにSnappyで圧縮されて永続化される
38
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
doc
3
doc2 doc1’
root(tx1)
dirtyページ
cleanページ
on diskページ
tx1
tx1
tdoc1→doc1'
ジャーナル
ジャーナル
doc1→doc1'
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き(たぶん正しい)
• tx1が終わる前に、doc1の読み込みトランザクションtx2が動き出
すと、古いドキュメントが見える
39
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
doc
3
doc2 doc1’
root(tx1)
dirtyページ
cleanページ
on diskページ
tx1
tx2
tx2
tx1
tdoc1→doc1'
doc1→doc1'
ジャーナル
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き(たぶん正しい)
• tx1がcommitした後に、tx3がdoc1を読みに行くと、
新しいdoc1' が見える
40
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
doc
3
doc2 doc1’
root(tx1)
dirtyページ
cleanページ
on diskページ
tx3
tx2
tx1
tx3
t
doc1→doc1'
ジャーナル
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き(たぶん正しい)
• 前回のチェックポイントから60秒経過するか、
ジャーナルが2GBを超えると、チェックポイントになる
• Evictionスレッドがcleanなページとdirtyなページをマージしてディス
クへ書き込む
41
doc1'
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
doc
3
doc2
Evictionスレッド
doc1’
root(tx1)
dirtyページ
cleanページ
on diskページ
doc1→doc1'
ジャーナル
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き(たぶん正しい)
• チェックポイントが終わると、古いツリーは消されて、
キャッシュとディスクが同期する
• ジャーナルは空になる
42
doc1'
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
index
doc
3
doc2 doc1’
root(tx1)
dirtyページ
cleanページ
on diskページ
ジャーナル
(空)
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
WiredTigerで、IOネックで、書き込みが遅いときの原因候補
• インデックス
– インデックスがある
• キャッシュ
– 更新するドキュメント・インデックスがメモリに無い
– ジャーナルとデータを同じディスクい書いている
– 全てのデータベースが同じディスクに書いている
– MongoDBのログをデータと同じディスクに書いている
– Write concertnで j:trueになっていてジャーナルの物理書き込みを
待っている
– ドキュメントのサイズが大きくなり、物理移動が発生している
– データ移動が頻発し、データファイルがフラグメンテーションして、
必要以上にメモリを圧迫している
43
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
WiredTigerで、IOネックで、読み込みが遅いときの原因候補
• インデックス
– インデックスが使われていない
– インデックスが有効ではない
• キャッシュ
– 起動直後でキャッシュが空
– ワーキングセット(インデックスと使うデータ)がメモリに対して
大すぎる
• メモリ上は圧縮されないので注意!
– 射影してもメモリにはドキュメント全体がのるが、その動きを知ら
ない
– ブロックサイズがドキュメントに対して大きすぎて無駄が多い
– OSにメモリの空きがなく、mongodがメモリをもらえていない
– WiredTigerだからおそい。MMAPv1よりやることが多い。
– WiredTigerのキャッシュを割り当てすぎてファイルキャッシュに使
えない(次ページで詳細)
44
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
WiredTigerキャッシュにメモリを割り当てすぎることによるデメリット
– mongodそのものでOOMになる可能性がある
– リードが多い場合は、Wiredキャッシュよりも、データが圧縮されている
ファイルキャッシュに多くのドキュメントを載せたほうが効率が良い事がある
45
mongodプロセス
WiredTigerキャッシュ
ディスク
メモリ
mongodそのものがつかうメモリ
Aggregation, Sort, 等
OS OSのファイルシステムキャッシュ
doc1
doc1
doc1
圧縮
圧縮
非圧縮
mongodの実メモリ
量
設定できるのは
ココだけ
空きメモリから
自動的に確保
2017/2/20更新: 「MongoDBのファイルキャッシュ」は存在しないため図から削
除
Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved
参考にした資料
• ちょっと古い公式説明資料。だいたい同じスライド
– http://www.slideshare.net/mongodb/mongo-db-
wiredtigerwebinar?ref=https%3A%2F%2Fwww.mongodb.co
m%2Fpresentations%2Fwebinar-a-technical-introduction-to-
wiredtiger
– http://www.slideshare.net/NorbertoLeite/mongodb-
wiredtiger-internals
– https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx
?id=9a55027f-2b6c-48f4-86f6-73cc167619d0
• 新しい公式セミナ。WiredTigerで使っている様々な工夫を詳細に
説明している。
– https://www.mongodb.com/presentations/mongodb-europe-
2016-building-wiredtiger
• ブログ。WiredTigerのstatの見方や、パフォーマンスチューニング
について解説している
– http://www.developer.com/db/tips-for-mongodb-wiredtiger-
performance-tuning.html
46
1 of 46

Recommended

MongoDBの監視 by
MongoDBの監視MongoDBの監視
MongoDBの監視Tetsutaro Watanabe
11.7K views24 slides
WiredTigerを詳しく説明 by
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明Tetsutaro Watanabe
8.9K views24 slides
分散トレーシング技術について(Open tracingやjaeger) by
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)NTT Communications Technology Development
23.3K views25 slides
ソーシャルゲーム案件におけるDB分割のPHP実装 by
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
51.8K views51 slides
がっつりMongoDB事例紹介 by
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介Tetsutaro Watanabe
23.2K views36 slides
初心者向けMongoDBのキホン! by
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!Tetsutaro Watanabe
52.5K views21 slides

More Related Content

What's hot

PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料) by
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)NTT DATA Technology & Innovation
3.6K views31 slides
MongoDB〜その性質と利用場面〜 by
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜Naruhiko Ogasawara
65.2K views61 slides
アーキテクチャから理解するPostgreSQLのレプリケーション by
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションMasahiko Sawada
30.2K views69 slides
Cassandraのしくみ データの読み書き編 by
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Yuki Morishita
30.8K views30 slides
Docker Compose 徹底解説 by
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説Masahito Zembutsu
61.1K views123 slides
コンテナの作り方「Dockerは裏方で何をしているのか?」 by
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
30.8K views96 slides

What's hot(20)

PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料) by NTT DATA Technology & Innovation
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
MongoDB〜その性質と利用場面〜 by Naruhiko Ogasawara
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
Naruhiko Ogasawara65.2K views
アーキテクチャから理解するPostgreSQLのレプリケーション by Masahiko Sawada
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
Masahiko Sawada30.2K views
Cassandraのしくみ データの読み書き編 by Yuki Morishita
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
Yuki Morishita30.8K views
コンテナの作り方「Dockerは裏方で何をしているのか?」 by Masahito Zembutsu
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu30.8K views
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 by Takuto Wada
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada148.6K views
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!) by Trainocate Japan, Ltd.
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
Apache Avro vs Protocol Buffers by Seiya Mizuno
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno5.3K views
SQL大量発行処理をいかにして高速化するか by Shogo Wakayama
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama57.8K views
Mongo dbを知ろう by CROOZ, inc.
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろう
CROOZ, inc.29.9K views
マイクロにしすぎた結果がこれだよ! by mosa siru
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru132.6K views
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料) by NTT DATA Technology & Innovation
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
本当は恐ろしい分散システムの話 by Kumazaki Hiroki
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki686K views
イミュータブルデータモデル(入門編) by Yoshitaka Kawashima
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima185.7K views
PostgreSQLアンチパターン by Soudai Sone
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone48.3K views
ストリーム処理を支えるキューイングシステムの選び方 by Yoshiyasu SAEKI
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI40.2K views

Viewers also liked

WiredTigerストレージエンジン楽しい by
WiredTigerストレージエンジン楽しいWiredTigerストレージエンジン楽しい
WiredTigerストレージエンジン楽しいAkihiro Kuwano
11.1K views40 slides
20110514 mongo dbチューニング by
20110514 mongo dbチューニング20110514 mongo dbチューニング
20110514 mongo dbチューニングYuichi Matsuo
27K views34 slides
MongoDBを使用したモバイルゲーム開発 by
MongoDBを使用したモバイルゲーム開発MongoDBを使用したモバイルゲーム開発
MongoDBを使用したモバイルゲーム開発Genki Yamada
18.6K views18 slides
QAアーキテクチャの設計による 説明責任の高いテスト・品質保証 by
QAアーキテクチャの設計による説明責任の高いテスト・品質保証QAアーキテクチャの設計による説明責任の高いテスト・品質保証
QAアーキテクチャの設計による 説明責任の高いテスト・品質保証Yasuharu Nishi
24.8K views95 slides
MongoDBのアレをアレする by
MongoDBのアレをアレするMongoDBのアレをアレする
MongoDBのアレをアレするAkihiro Kuwano
14.5K views73 slides
MongoDB全機能解説1 by
MongoDB全機能解説1MongoDB全機能解説1
MongoDB全機能解説1Takahiro Inoue
54.6K views74 slides

Viewers also liked(6)

WiredTigerストレージエンジン楽しい by Akihiro Kuwano
WiredTigerストレージエンジン楽しいWiredTigerストレージエンジン楽しい
WiredTigerストレージエンジン楽しい
Akihiro Kuwano11.1K views
20110514 mongo dbチューニング by Yuichi Matsuo
20110514 mongo dbチューニング20110514 mongo dbチューニング
20110514 mongo dbチューニング
Yuichi Matsuo27K views
MongoDBを使用したモバイルゲーム開発 by Genki Yamada
MongoDBを使用したモバイルゲーム開発MongoDBを使用したモバイルゲーム開発
MongoDBを使用したモバイルゲーム開発
Genki Yamada18.6K views
QAアーキテクチャの設計による 説明責任の高いテスト・品質保証 by Yasuharu Nishi
QAアーキテクチャの設計による説明責任の高いテスト・品質保証QAアーキテクチャの設計による説明責任の高いテスト・品質保証
QAアーキテクチャの設計による 説明責任の高いテスト・品質保証
Yasuharu Nishi24.8K views
MongoDBのアレをアレする by Akihiro Kuwano
MongoDBのアレをアレするMongoDBのアレをアレする
MongoDBのアレをアレする
Akihiro Kuwano14.5K views
MongoDB全機能解説1 by Takahiro Inoue
MongoDB全機能解説1MongoDB全機能解説1
MongoDB全機能解説1
Takahiro Inoue54.6K views

Similar to MongoDBが遅いときの切り分け方法

PHP開発者のためのNoSQL入門 by
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門じゅん なかざ
6.3K views66 slides
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編) by
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)Akihiro Kuwano
16K views44 slides
地方企業がソーシャルゲーム開発を成功させるための10のポイント by
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイントKentaro Matsui
4.8K views40 slides
使ってみた!ioMemoryで実現する噂のAtomic write! by
使ってみた!ioMemoryで実現する噂のAtomic write!使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!IIJ
5.1K views62 slides
MongoDB勉強会資料 by
MongoDB勉強会資料MongoDB勉強会資料
MongoDB勉強会資料Hiromune Shishido
2.8K views29 slides
シラサギハンズオン 東京 by
シラサギハンズオン 東京シラサギハンズオン 東京
シラサギハンズオン 東京Yu Ito
2.9K views140 slides

Similar to MongoDBが遅いときの切り分け方法(20)

大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編) by Akihiro Kuwano
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
Akihiro Kuwano16K views
地方企業がソーシャルゲーム開発を成功させるための10のポイント by Kentaro Matsui
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント
Kentaro Matsui4.8K views
使ってみた!ioMemoryで実現する噂のAtomic write! by IIJ
使ってみた!ioMemoryで実現する噂のAtomic write!使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!
IIJ5.1K views
シラサギハンズオン 東京 by Yu Ito
シラサギハンズオン 東京シラサギハンズオン 東京
シラサギハンズオン 東京
Yu Ito2.9K views
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - by Tetsutaro Watanabe
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
DB tech showcase: 噂のMongoDBその用途は? by Hiroaki Kubota
DB tech showcase: 噂のMongoDBその用途は?DB tech showcase: 噂のMongoDBその用途は?
DB tech showcase: 噂のMongoDBその用途は?
Hiroaki Kubota16.9K views
ビッグデータ処理データベースの全体像と使い分け by Recruit Technologies
ビッグデータ処理データベースの全体像と使い分けビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分け
Recruit Technologies31.7K views
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜 by Takahiro Inoue
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
Takahiro Inoue43.2K views
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック by infinite_loop
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop48.1K views
シラサギハンズオン 大阪 by Yu Ito
シラサギハンズオン 大阪シラサギハンズオン 大阪
シラサギハンズオン 大阪
Yu Ito2.7K views
泥臭い運用から、プログラマブルインフラ構築(に行きたい) by Akihiro Kuwano
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
Akihiro Kuwano4K views
既存システムへの新技術活用法 ~fluntd/MongoDB~ by じゅん なかざ
既存システムへの新技術活用法 ~fluntd/MongoDB~既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~
20120405 setsunaセミナー by Takahiro Iwase
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナー
Takahiro Iwase848 views
Introduction to MongoDB by moai kids
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
moai kids15.5K views
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例 by terurou
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
terurou2.6K views
ビックデータ処理技術の全体像とリクルートでの使い分け by Tetsutaro Watanabe
ビックデータ処理技術の全体像とリクルートでの使い分けビックデータ処理技術の全体像とリクルートでの使い分け
ビックデータ処理技術の全体像とリクルートでの使い分け
Tetsutaro Watanabe2.1K views
ioMemoryとAtomic Writeによるデータベース高速化 by IIJ
ioMemoryとAtomic Writeによるデータベース高速化ioMemoryとAtomic Writeによるデータベース高速化
ioMemoryとAtomic Writeによるデータベース高速化
IIJ2.5K views

More from Tetsutaro Watanabe

データサイエンティスト向け性能問題対応の基礎 by
データサイエンティスト向け性能問題対応の基礎データサイエンティスト向け性能問題対応の基礎
データサイエンティスト向け性能問題対応の基礎Tetsutaro Watanabe
10.7K views17 slides
MLOpsはバズワード by
MLOpsはバズワードMLOpsはバズワード
MLOpsはバズワードTetsutaro Watanabe
6.1K views15 slides
ドライブレコーダの動画を使った道路情報の自動差分抽出 by
ドライブレコーダの動画を使った道路情報の自動差分抽出ドライブレコーダの動画を使った道路情報の自動差分抽出
ドライブレコーダの動画を使った道路情報の自動差分抽出Tetsutaro Watanabe
5.3K views35 slides
IoTデバイスデータ収集の難しい点 by
IoTデバイスデータ収集の難しい点IoTデバイスデータ収集の難しい点
IoTデバイスデータ収集の難しい点Tetsutaro Watanabe
3.2K views17 slides
ドライブレコーダの画像認識による道路情報の自動差分抽出 by
ドライブレコーダの画像認識による道路情報の自動差分抽出ドライブレコーダの画像認識による道路情報の自動差分抽出
ドライブレコーダの画像認識による道路情報の自動差分抽出Tetsutaro Watanabe
1.4K views27 slides
先駆者に学ぶ MLOpsの実際 by
先駆者に学ぶ MLOpsの実際先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際Tetsutaro Watanabe
19.6K views32 slides

More from Tetsutaro Watanabe(18)

データサイエンティスト向け性能問題対応の基礎 by Tetsutaro Watanabe
データサイエンティスト向け性能問題対応の基礎データサイエンティスト向け性能問題対応の基礎
データサイエンティスト向け性能問題対応の基礎
Tetsutaro Watanabe10.7K views
ドライブレコーダの動画を使った道路情報の自動差分抽出 by Tetsutaro Watanabe
ドライブレコーダの動画を使った道路情報の自動差分抽出ドライブレコーダの動画を使った道路情報の自動差分抽出
ドライブレコーダの動画を使った道路情報の自動差分抽出
Tetsutaro Watanabe5.3K views
IoTデバイスデータ収集の難しい点 by Tetsutaro Watanabe
IoTデバイスデータ収集の難しい点IoTデバイスデータ収集の難しい点
IoTデバイスデータ収集の難しい点
Tetsutaro Watanabe3.2K views
ドライブレコーダの画像認識による道路情報の自動差分抽出 by Tetsutaro Watanabe
ドライブレコーダの画像認識による道路情報の自動差分抽出ドライブレコーダの画像認識による道路情報の自動差分抽出
ドライブレコーダの画像認識による道路情報の自動差分抽出
Tetsutaro Watanabe1.4K views
データ収集の基本と「JapanTaxi」アプリにおける実践例 by Tetsutaro Watanabe
データ収集の基本と「JapanTaxi」アプリにおける実践例データ収集の基本と「JapanTaxi」アプリにおける実践例
データ収集の基本と「JapanTaxi」アプリにおける実践例
Tetsutaro Watanabe19.6K views
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめ by Tetsutaro Watanabe
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめ
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめ
Tetsutaro Watanabe3.2K views
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた by Tetsutaro Watanabe
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみたタクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
Tetsutaro Watanabe6.8K views
JapanTaxiにおけるSagemaker+αによる機械学習アプリケーションの本番運用 by Tetsutaro Watanabe
JapanTaxiにおけるSagemaker+αによる機械学習アプリケーションの本番運用JapanTaxiにおけるSagemaker+αによる機械学習アプリケーションの本番運用
JapanTaxiにおけるSagemaker+αによる機械学習アプリケーションの本番運用
Tetsutaro Watanabe3.2K views
JapanTaxiにおけるML Ops 〜機械学習の開発運用プロセス〜 by Tetsutaro Watanabe
JapanTaxiにおけるML Ops 〜機械学習の開発運用プロセス〜JapanTaxiにおけるML Ops 〜機械学習の開発運用プロセス〜
JapanTaxiにおけるML Ops 〜機械学習の開発運用プロセス〜
Tetsutaro Watanabe6.2K views
ビッグデータ処理データベースの全体像と使い分け
2018年version by Tetsutaro Watanabe
ビッグデータ処理データベースの全体像と使い分け
2018年versionビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年version
Tetsutaro Watanabe21.2K views
Google Cloud Next '18 Recap/報告会 機械学習関連 by Tetsutaro Watanabe
Google Cloud Next '18 Recap/報告会 機械学習関連Google Cloud Next '18 Recap/報告会 機械学習関連
Google Cloud Next '18 Recap/報告会 機械学習関連
Tetsutaro Watanabe2.9K views
巨大なサービスと膨大なデータを支えるプラットフォーム
 by Tetsutaro Watanabe
巨大なサービスと膨大なデータを支えるプラットフォーム
巨大なサービスと膨大なデータを支えるプラットフォーム

巨大なサービスと膨大なデータを支えるプラットフォーム

Tetsutaro Watanabe1.7K views
リクルートを支える横断データ基盤と機械学習の適用事例 by Tetsutaro Watanabe
リクルートを支える横断データ基盤と機械学習の適用事例リクルートを支える横断データ基盤と機械学習の適用事例
リクルートを支える横断データ基盤と機械学習の適用事例
Tetsutaro Watanabe17.9K views
リクルートテクノロジーズ における EMR の活用とコスト圧縮方法 by Tetsutaro Watanabe
リクルートテクノロジーズ における EMR の活用とコスト圧縮方法リクルートテクノロジーズ における EMR の活用とコスト圧縮方法
リクルートテクノロジーズ における EMR の活用とコスト圧縮方法
Tetsutaro Watanabe3.4K views

Recently uploaded

The Things Stack説明資料 by The Things Industries by
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things IndustriesCRI Japan, Inc.
41 views29 slides
Windows 11 information that can be used at the development site by
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development siteAtomu Hidaka
71 views41 slides
01Booster Studio ご紹介資料 by
01Booster Studio ご紹介資料01Booster Studio ご紹介資料
01Booster Studio ご紹介資料ssusere7a2172
300 views19 slides
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
13 views38 slides
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化 by
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化Knowledge & Experience
8 views34 slides
Web3 Career_クレデン資料 .pdf by
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdfnanamatsuo
14 views9 slides

Recently uploaded(12)

The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.41 views
Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka71 views
01Booster Studio ご紹介資料 by ssusere7a2172
01Booster Studio ご紹介資料01Booster Studio ご紹介資料
01Booster Studio ご紹介資料
ssusere7a2172300 views
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化 by Knowledge & Experience
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
Web3 Career_クレデン資料 .pdf by nanamatsuo
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdf
nanamatsuo14 views
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda175 views
さくらのひやおろし2023 by 法林浩之
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023
法林浩之91 views
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4172 views
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)

MongoDBが遅いときの切り分け方法

  • 1. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved MongoDBが遅いときの切り分け方法 コンサルタント 渡部 徹太郎 1
  • 2. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 自己紹介 2 {"ID" :"fetaro" "名前":"渡部 徹太郎" "研究":"東京工業大学でデータベースと情報検索の研究 (@日本データベース学会)" "仕事":{前職:["証券会社のオンライントレードシステムのWeb基盤", "オープンソースなら何でも。主にMongoDB,NoSQL"], 現職:["大手Web企業の横断分析基盤,Exadata,Hortonworks,EMR"] 副業:["MongoDBコンサルタント" ]} "エディタ":"emacs派", "趣味": ["自宅サーバ","麻雀"] }
  • 3. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved はじめに MongoDBは速い? • MongoDBはNoSQLだからRDBより速い? • シャーディングすれば単体構成より速い? 3
  • 4. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved はじめに MongoDBは速い?→ケースに依る • MongoDBはNoSQLだからRDBより速い わけではない – RDBとは提供している機能が違う • トランザクション、JOIN、副問合せ等のRDBで遅くなりがちな 複雑なクエリはMongoDBは提供していない • データモデルが違う、保証する整合性が違う – シンプルなクエリであればRDBとMongoDBでそれほど差はな い • MongoDBはオーバーヘッドが少ない分速いが • 結局はディスクIOをどれだけ減らせるか • シャーディングすれば単体構成より速い とは限らない – ボトルネックが分散するようにシャーディングを組まないとい けない – データだけ分散しても駄目。クエリの分散まで考える必要あり – クエリが分散してもボトルネックが解消しないと駄目。 • 例)ネットワークネックならばIOが減っても意味なし 4
  • 5. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved はじめに MongoDBを速くしたければRDBを勉強すべき • MongoDBだから特別なことはほとんどない • MongoDBはRDBに似ている – CassandraやDynamoDB 等はRDBと大きく違う • 8割はRDBのパフォーマンスチューニングの知識でカバーで きる – インデックス、クエリ最適化、キャッシュ、データ圧縮、WAL、 リードレプリカ、パーティショニング • 残り2割はMongoDB特有 – データ構造(JSON)が性能に与える影響 – シャーディング 今回の発表は、RDBにも通用する一般的な話が多いです 5
  • 6. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved アジェンダ • 性能問題との向き合い方 • 解くべき問題の明確化 • 根本原因の特定 • IOボトルネックの解消 – MMAPv1の場合 – WiredTigerの場合 6
  • 7. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 性能問題との向き合い方 7
  • 8. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 性能問題を考える場合の思考順序 1. 解くべき問題の明確化 – 本当にMongoDBが遅いのか? • アプリやネットワークに問題はないか – どのクエリが遅いのか? • 読み込み, 書き込み, 集計 – 何を改善したいのか(性能要件の明確化) • レスポンスタイム,スループット 2. 根本原因の特定 – リソースが枯渇しているのか? • CPU, メモリ/ディスク, NW帯域 – 非効率な処理をしていないか? • ロック開放待ち、フェッチ、NWラウンドトリップ 3. 根本原因の解消 – リソース枯渇の場合 1. 単体構成の性能を最大限まで上げる→ 8割これでいける! 2. リードレプリカ→おまけ 3. シャーディング→最後の手段 – 処理が非効率の場合 • アプリを見直す 8
  • 9. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 性能問題調査でよくある間違い • よくある勘違い – CPU使用率が高すぎることが原因だ! • →いいことです – メモリ使用率が高すぎることが原因だ! • →溢れてIOが発生していなければ、いいことです • 全てのリソースを最大限まで使えたら完璧なチューニング • つまり – CPU使用率100% – メモリ使用率100% – ディスクI/O使用率100% – NW使用率100% を同時に見対している状態 9 考え方の整理はこの本がおすすめ
  • 10. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 解くべき問題の明確化 10
  • 11. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 本当にMongoDBが遅いのか? • 「画面の応答が遅い」「アプリの実行時間がながい」 →本当にMongoDBが遅いんですか? • ミドルウェアのログから各レイヤでの処理時間を計測 – 大多数のケースで、これが整理できていない 11 ブラウザ Webアプリ MongoDB t0 t1 t2 t3 t4 t5 t6 本当にココ が遅いの か?
  • 12. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved MongoDBの何が遅いのか • 何のクエリが遅いのか? – 読み取り、書き込み、集計 – 可能であればクエリを特定する • 何の指標が遅いのか? – レスポンスタイムが遅い • スロークエリログを見てクエリ応答時間をみる • プロファイラを有効にしてクエリの情報を見る – スループットが低い • mongostatを見て、単位時間あたりの処理量をみる • mongotopを見て、コレクションごとの処理量をみる 12
  • 13. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 遅い箇所の調べ方 • スロークエリログ – 設定ファイルで起動前に指定する – デフォルトで100msを超えるクエリは、ログに出力される • プロファイラ – 起動後にMongoShellなどで接続して一時的にプロファイラを有効 にする 13 2015-07-10T04:09:01.113+0900 I COMMAND [conn1] command test.$cmd command: insert { insert: "mycol", documents: [ { _id: ObjectId('559ec6cd959e8f181ae68153'), name: "watanabe" } ], ordered: true } keyUpdates:0 writeConflicts:0 numYields:0 reslen:40 locks:{ Global: { acquireCount: { r: 2, w: 2 } }, Database: { acquireCount: { w: 2 } }, Collection: { acquireCount: { w: 2 } } } 120ms #プロファイラを有効にする > db.setProfilingLevel(1) { "was" : 0, "slowms" : 100, "ok" : 1 } #中身を見る > db.system.profile.find()
  • 14. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 遅い箇所の調べ方 • mongostatコマンド • mongotopコマンド 14 $./bin/mongostat connected to: 127.0.0.1 insert query update delete getmore command flushes mapped vsize res ... 40 *0 *0 *0 0 1|0 1 12g 24.4g 51m ... 30 *0 *0 *0 0 1|0 0 12g 24.4g 52m ... 32 *0 *0 *0 0 1|0 0 12g 24.4g 53m ... $ ./bin/mongotop ns total read write 2015-07-10T04:56:52+09:00 mydb.mycol 6ms 6ms 0ms admin.system.roles 0ms 0ms 0ms admin.system.version 0ms 0ms 0ms ns total read write 2015-07-10T04:56:53+09:00 mydb.mycol 44ms 44ms 0ms admin.system.roles 0ms 0ms 0ms admin.system.version 0ms 0ms 0ms
  • 15. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 遅い箇所の調べ方 • MongoDB CloudManager(旧OpsManager, MMS)を使って も良い – あらかじめMongoDBに特化したメトリックがとられる – 監視項目を設計しなくて良い 15
  • 16. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 根本原因の特定 16
  • 17. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 根本原因の特定 • 結論は2種類 – ボトルネックが有る or – ボトルネックが無い • ボトルネックが有る – CPU 1core張り付き、高ロードアベレージ→1.CPUボトルネック – メモリ空き容量0、ディスクIO頻発→2.IOボトルネック – ネットワーク流量 逼迫(80%超え) →3.NWボトルネック • ボトルネックがない – MongoDBに本気を出させることが出来ていない→4.処理の非効率 17
  • 18. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 根本原因の特定 1.CPUボトルネック • 概要 – Aggregationや算術演算で、CPUを使う処理が多い場合にボトルネックになるこ とがある。 – CPUボトルネックはIOやネットワークにボトルネックがない場合がおおいため、 どちらかといえば健全な状態。 • チェック方法 – 1コアに注目したとき、使用率のuserとsysの合計が100%になっていないか • 全体のCPU使用率50%、25%、12.5%は要注意 – 50%→2core中1つが100% – 25%→4core中1つが100% – 12.5%→8core中1つが100% • 例 ) $ dstat -c -C 0,1,2,3,total – ロードアベレージはコア数以上になっていないか • 解消方法 – 応答性能向上 • マルチスレッドで動作する演算ならばコア数を上げる • そうでないならCPUクロック数を上げる – スループット向上 • コア数を上げる 18
  • 19. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 根本原因の特定 2.ネットワークボトルネック • 概要 – アプリケーションに対してMongoDBが大量のデータを返す場合に 多い。 – 他には、レプリケーションのoplog転送量が想定以上に肥大化し、 ネットワークを圧迫している場合もある • チェック方法 – mongostatやOSのdstatコマンドにより、ネットワークの流量を監 視し、ネットワークのキャパシティ(1Gbit, 10GBit等)に対して流 れている流量が限界に達していないか? – 1Gbit/sの設定であれば800Mbit/sあたりで限界 • 解消方法 – ネットワークを太くする – 射影してアプリケーションで受け取るデータを減らす – oplogが肥大化が原因の場合は、肥大化を引き起こすオペレーショ ンに注意する • multi updateやremove、配列の$popや$pullなど 詳細は https://enterprisezine.jp/dbonline/detail/8095 19
  • 20. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 根本原因の特定 3.IOボトルネック • 概要 – メモリ上にデータがなく、ディスクにデータを読みに行くことが頻発 すると、ディスクはメモリに対して100倍程度遅いため、全体として処 理速度が低下する。 – MongoDB(というかDB全般)では大半がこのケース • チェック方法 – OSのiostatコマンドで、 avgqusz, await, %util が高い。 rMB/s、 wMB/sがいつもより多い。CPUのiowaitが多い – キャッシュが溢れている • MMAPv1の場合、mongostatのページフォルトが多い • WiredTigerの場合、キャッシュへの読み込み累積値(bytes read into cache)が物理メモリ量を超えて増え続けている • 解消方法 – 次ページで説明 20
  • 21. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 根本原因の特定 3.IOボトルネック - 解消方法 1. インデックス – RDBと同じB-Treeでインデックスがあるので、同じ考え方でインデックスを設 計すれば良い – 実行計画の見方 • db.mycol.find().explain() →実行はしないで計画を表示 • db.mycol.find().explain("executionStats") →実際に実行する 2. メモリキャッシュ – メモリを駆使してIOボトルネックを解消するには MongoDBのアーキテクチャの理解が必須 – ストレージエンジンによって全く違う • MMAPv1 : メモリ管理をOSまかせ • WiredTiger : MongoDBが買収した最先端のストレージ – →後半でガッツリ説明 21
  • 22. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 根本原因の特定 4. 処理の非効率 • 書き込みが遅い – ロック開放待ちになっている(MMAP限定) – バッチインサートしていない – Write Concernの値が必要以上に大きい – WiredTigerの場合は同時に実行できるクエリ数にそれぞれ128 の制限(Ticketsという)があり、それに引っかかっていないか • db.serverStatus().wiredTiger.concurrentTransactions • 読み込みが遅い – フェッチが細かすぎる – 同時実行 – 同時実行クエリ数制限 22
  • 23. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved IOボトルネックの解消 MMAPv1の場合 23
  • 24. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 読み込み時の動き(MMAP) • 起動時に、mongodは、OSに対して、 データベースファイルをメモリにmapするように依頼する – システムコールmmap()を実行 • 起動直後はメモリは空 24 doc1 doc3index doc2 ディスク メモリ mongodプロセス OSが管理 ブロック データベースファイル mmap( )
  • 25. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 読み込み時の動き(MMAP) • mongodがdoc1を読もうとすると – mongodは、OSに対して、ブロックの取得を依頼 – OSは、メモリ上にないので、ディスクから読む(=遅い) • ページフォルト発生 • doc1と関連するindexのブロックだけが読み込まれる 25 doc1 doc3index doc2 ディスク メモリ doc1 mongodプロセス index
  • 26. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 読み込み時の動き(MMAP) • doc1をもう一度読む – mogodは、OSに対して、ブロックの取得を依頼 – OSは、メモリにあるので、メモリから返す応答する(=速い) 26 doc1 doc3index doc2 ディスク メモリ doc1 mongodプロセス index
  • 27. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 読み込み時の動き(MMAP) • doc2を読むと – indexはメモリにあるが、doc2はメモリにないので、ディスク から読む(遅い) 27 doc1 doc3index doc2 ディスク メモリ doc1 mongodプロセス doc2index
  • 28. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 読み込み時の動き(MMAP) • doc3を読むと – doc3はメモリにないので、ディスクから読む – 空きがないので、最もアクセス頻度の低いブロックを追い出す(ス ワップアウト) 28 doc1 doc3index doc2 ディスク メモリ mongodプロセス index doc3
  • 29. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved MMAPで、IOネックで、読み込みが遅いときの原因候補 • インデックス – インデックスが使われていない – インデックスが有効ではない • フルスキャンの方が効率が良い • hint()の利用を検討 • キャッシュ – 起動直後でキャッシュが空 – ワーキングセット(インデックスと使うデータ)がメモリに対して大す ぎる – OSにメモリの空きがなく、mongodがメモリをもらえていない – 射影してもメモリにはドキュメント全体がのるが、その動きを知らない • db.mycol.find({},{"name":1}) としてもname以外のデータもメモリに 乗る – ブロックサイズがドキュメントに対して大きすぎて無駄が多い 29 doc1 無駄
  • 30. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 書き込み時の動き(MMAP)ジャーナルなし • update doc1を実行すると – mongodは、OSに対して、データベース単位のロックを依頼して更新 • MongoDB 3.0ではコレクションレベルでロック – 他のスレッドからの書き込みは待たされる(=遅くなる) – メモリ上にindexとdoc1があればメモリ上で更新は完結。なければIO発生 – 非同期でディスクに書き戻し(60秒に一回) • クラッシュすると最悪60秒間ロストする&データベースファイルが破損する 30 doc1 doc3index doc2 ディスク メモリmongodプロセス doc2index' スレッド スレッド 書き込みを待たされる2.ロック・ doc1とindexを更 新 × 1.アプリからクエリ4.アプリに返却 ロック開放 5.60秒に1回ディスクに書き戻し fsync() doc1'
  • 31. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 書き込み時の動き(MMAP)ジャーナルあり • update doc1 – ジャーナルファイルに更新内容を記載 • クラッシュしても100ms以内の変更は保持 • クラッシュしてもデータ破損自動修復 31 doc1 doc3index doc2 ディスク メモリmongodプロセス doc2 スレッド 2.ロックを取得 更新内容を追記 ジャーナル ジャーナル 5.100msに1回flash (j:trueなら即時) 4.アプリに返却 ロックを開放 1.アプリからクエリ 3. doc1とindexを 更新 6.60秒に1回ディス クに書き戻し doc1'index'
  • 32. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved MMAPで、IOネックで、書き込みが遅いときの原因候補 • インデックス – インデックスがある • キャッシュ – 更新するドキュメント・インデックスがメモリに無い – ジャーナルとデータを同じディスクい書いている – 全てのデータベースが同じディスクに書いている – MongoDBのログをデータと同じディスクに書いている – Write concertnで j:trueになっていてジャーナルの物理書き込みを待って いる – ドキュメントのサイズが大きくなり、物理移動が発生している • 肥大化が起こると、そのコレクションでは、次からドキュメントサイズに余裕を 持って物理領域を取るようになる→Padding factorの増加 – データ移動が頻発し、データファイルがフラグメンテーションして、必要 以上にメモリを利用しなくてはならない 32 doc1 doc3index doc2 doc3index doc2 doc1' doc1index doc2 doc3
  • 33. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved IOボトルネックの解消 WiredTigerの場合 33
  • 34. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved WiredTigerの基本 • WiredTigerとは – MongoDB,Incが買収したストレージ – MMAPv1を差し替えることができる • MMAPv1との違い – OS任せだったメモリキャッシュを、ある程度制御するようになっ た – 更新は、その場(in place)ではなく、新しいバージョンのドキュメ ントを挿入して、ポインタを張り替えようになった(MVCC,CAS) • ロックが無くなった(事実上ドキュメントレベルロックと同じ) • データファイルのフラグメンテーションがなくなった • データの肥大化による移動がなくなった • 裏で、古いバージョンをマージする動作(eviction)をするようになった • これらにより、複数スレッドでマルチコアを有効に使って、スルー プットをあげられるようになった – インデックスとデータが別ファイルになった – データの圧縮ができるようになった(メモリ量は圧縮できない) 34
  • 35. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved mongodプロセス WiredTigerキャッシュ WiredTigerの動き(たぶん正しい) • 起動直後はWiredTigerキャッシュは空 35 doc1 doc 3index ディスク メモリ doc2 Readスレッド Writeスレッド dirtyページ cleanページ on diskページ root
  • 36. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved mongodプロセス WiredTigerキャッシュ WiredTigerの動き(たぶん正しい) • 読み込むとツリーが形成される • ツリーのリーフはディスクのページ毎に読み込まれている • 以下の例ではdoc1を読んでいるので、indexとdocが含まれるページがキャッシュにのる 36 doc1 doc 3index ディスク メモリ doc2 Readスレッド Writeスレッド doc1index root dirtyページ cleanページ on diskページ
  • 37. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved mongodプロセス WiredTigerキャッシュ WiredTigerの動き(たぶん正しい) • さらにdoc2やdoc3を読むと、キャッシュにのる 37 doc1 doc 3index ディスク メモリ doc2 Readスレッド Writeスレッド doc1index root doc 3 doc2 dirtyページ cleanページ on diskページ
  • 38. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved mongodプロセス WiredTigerキャッシュ WiredTigerの動き(たぶん正しい) • ここでトランザクションtx1でdoc1をdoc1'に更新しようとする (説明を簡単にするため、index更新は図から省略) – これは新しいツリーをつくる動きになる • それとは別に、メモリ上のジャーナルに更新内容を書き込む – 50ms毎にディスクにSnappyで圧縮されて永続化される 38 doc1 doc 3index ディスク メモリ doc2 Readスレッド Writeスレッド doc1index root doc 3 doc2 doc1’ root(tx1) dirtyページ cleanページ on diskページ tx1 tx1 tdoc1→doc1' ジャーナル ジャーナル doc1→doc1'
  • 39. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved mongodプロセス WiredTigerキャッシュ WiredTigerの動き(たぶん正しい) • tx1が終わる前に、doc1の読み込みトランザクションtx2が動き出 すと、古いドキュメントが見える 39 doc1 doc 3index ディスク メモリ doc2 Readスレッド Writeスレッド doc1index root doc 3 doc2 doc1’ root(tx1) dirtyページ cleanページ on diskページ tx1 tx2 tx2 tx1 tdoc1→doc1' doc1→doc1' ジャーナル
  • 40. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved mongodプロセス WiredTigerキャッシュ WiredTigerの動き(たぶん正しい) • tx1がcommitした後に、tx3がdoc1を読みに行くと、 新しいdoc1' が見える 40 doc1 doc 3index ディスク メモリ doc2 Readスレッド Writeスレッド doc1index root doc 3 doc2 doc1’ root(tx1) dirtyページ cleanページ on diskページ tx3 tx2 tx1 tx3 t doc1→doc1' ジャーナル
  • 41. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved mongodプロセス WiredTigerキャッシュ WiredTigerの動き(たぶん正しい) • 前回のチェックポイントから60秒経過するか、 ジャーナルが2GBを超えると、チェックポイントになる • Evictionスレッドがcleanなページとdirtyなページをマージしてディス クへ書き込む 41 doc1' doc 3index ディスク メモリ doc2 Readスレッド Writeスレッド doc1index root doc 3 doc2 Evictionスレッド doc1’ root(tx1) dirtyページ cleanページ on diskページ doc1→doc1' ジャーナル
  • 42. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved mongodプロセス WiredTigerキャッシュ WiredTigerの動き(たぶん正しい) • チェックポイントが終わると、古いツリーは消されて、 キャッシュとディスクが同期する • ジャーナルは空になる 42 doc1' doc 3index ディスク メモリ doc2 Readスレッド Writeスレッド index doc 3 doc2 doc1’ root(tx1) dirtyページ cleanページ on diskページ ジャーナル (空)
  • 43. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved WiredTigerで、IOネックで、書き込みが遅いときの原因候補 • インデックス – インデックスがある • キャッシュ – 更新するドキュメント・インデックスがメモリに無い – ジャーナルとデータを同じディスクい書いている – 全てのデータベースが同じディスクに書いている – MongoDBのログをデータと同じディスクに書いている – Write concertnで j:trueになっていてジャーナルの物理書き込みを 待っている – ドキュメントのサイズが大きくなり、物理移動が発生している – データ移動が頻発し、データファイルがフラグメンテーションして、 必要以上にメモリを圧迫している 43
  • 44. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved WiredTigerで、IOネックで、読み込みが遅いときの原因候補 • インデックス – インデックスが使われていない – インデックスが有効ではない • キャッシュ – 起動直後でキャッシュが空 – ワーキングセット(インデックスと使うデータ)がメモリに対して 大すぎる • メモリ上は圧縮されないので注意! – 射影してもメモリにはドキュメント全体がのるが、その動きを知ら ない – ブロックサイズがドキュメントに対して大きすぎて無駄が多い – OSにメモリの空きがなく、mongodがメモリをもらえていない – WiredTigerだからおそい。MMAPv1よりやることが多い。 – WiredTigerのキャッシュを割り当てすぎてファイルキャッシュに使 えない(次ページで詳細) 44
  • 45. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved WiredTigerキャッシュにメモリを割り当てすぎることによるデメリット – mongodそのものでOOMになる可能性がある – リードが多い場合は、Wiredキャッシュよりも、データが圧縮されている ファイルキャッシュに多くのドキュメントを載せたほうが効率が良い事がある 45 mongodプロセス WiredTigerキャッシュ ディスク メモリ mongodそのものがつかうメモリ Aggregation, Sort, 等 OS OSのファイルシステムキャッシュ doc1 doc1 doc1 圧縮 圧縮 非圧縮 mongodの実メモリ 量 設定できるのは ココだけ 空きメモリから 自動的に確保 2017/2/20更新: 「MongoDBのファイルキャッシュ」は存在しないため図から削 除
  • 46. Copyright ⓒ2016 CREATIONLINE, INC. All Rights Reserved 参考にした資料 • ちょっと古い公式説明資料。だいたい同じスライド – http://www.slideshare.net/mongodb/mongo-db- wiredtigerwebinar?ref=https%3A%2F%2Fwww.mongodb.co m%2Fpresentations%2Fwebinar-a-technical-introduction-to- wiredtiger – http://www.slideshare.net/NorbertoLeite/mongodb- wiredtiger-internals – https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx ?id=9a55027f-2b6c-48f4-86f6-73cc167619d0 • 新しい公式セミナ。WiredTigerで使っている様々な工夫を詳細に 説明している。 – https://www.mongodb.com/presentations/mongodb-europe- 2016-building-wiredtiger • ブログ。WiredTigerのstatの見方や、パフォーマンスチューニング について解説している – http://www.developer.com/db/tips-for-mongodb-wiredtiger- performance-tuning.html 46