パフォーマンスのトラブルシューティング Databases for MongoDB
このガイドを使用して、 IBM Cloud 上で実行され、 MongoDB によって供給される Databases for MongoDB 展開におけるパフォーマンスの問題を特定し、解決してください。
また、パフォーマンスに関する問題の解決方法については、以下のページをご参照ください:
アプリケーションの応答が遅い、タイムアウトが発生する、またはデータベースのパフォーマンスが安定しない場合は、以下の手順と情報を検討してください。
パフォーマンス問題の症状
パフォーマンスの問題を示す以下のような症状が見られるかもしれません:
- アプリケーションの待ち時間の増加
- クエリログのエントリが遅い
- CPUまたはメモリの使用率が高い
- ディスクの待ち時間の増加
- レプリケーション・ラグ
- 接続タイムアウト
以下のステップを完了し、問題の原因を特定する:
ステップ1:リソースの利用状況を確認する
-
IBM Cloud コンソールにログインし、 MongoDB 配置に移動します。
-
モニタリングのセクションを見直す:
- CPU 使用率
- メモリー使用率
- ディスクのIOPSとレイテンシー
- アクティブ接続数
何を探すべきか:
- CPUが常に75%以上
- メモリは常に80%以上
- 時間とともに増加するディスクの待ち時間
- プランの限界に近づくコネクション
推奨される行動
- ディスクのレイテンシーが高い場合は、ストレージまたはIOPSを増やす。
- アプリケーションのワークロード急増を見直す。
リソースの使用量が高い状態が続く場合は、スケーリングすることを推奨する。
ステップ2:遅いクエリを特定する
遅いクエリは、パフォーマンス低下の最も一般的な原因の1つです。
-
プロファイリングを有効にする:
db.setProfilingLevel(1, { slowms: 100 }) -
最近の低調なオペレーションを見直す:
db.system.profile.find().sort({ ts: -1 }).limit(20) -
クエリの実行を分析する:
db.collection.find({ ... }).explain("executionStats")
何を探すべきか:
COLLSCAN(インデックス使用の代わりにコレクションスキャン)totalDocsExaminedに比べて高い。nReturned
推奨される行動
- 適切なインデックスを作成する。
- 複数フィールドのクエリには複合インデックスを使用します。
- アグリゲーション・パイプラインが
$matchで始まるようにする。 skip()大きなページネーションは避ける。
ステップ3:接続の使用状況を確認する
接続数が多かったり、管理が不十分だったりすると、パフォーマンスに影響を与える可能性がある。
接続統計を確認する:
db.serverStatus().connections
推奨される行動
- アプリケーションでコネクション・プーリングを使用する。
- リクエストごとに新しいコネクションを開くのは避ける。
- 使用していないカーソルを閉じる。
接続制限は、お客様の導入プランによって決定されます。
ステップ4:レプリケーションの健全性をチェックする
レプリケーションの遅延は、読み取りパフォーマンスとデータの鮮度に影響を与える可能性がある。
レプリケーションの状態を確認する:
rs.printSecondaryReplicationInfo()
一般的な遅れの原因:
- 高い書き込みスループット
- ディスクのボトルネック
- ネットワーク待ち時間
推奨される行動
- ストレージ性能の拡張。
- 書き込みに関する設定を見直す。
- タイムラグが続く場合は、より高いプランに変更する。
ステップ5:シャーデッド・クラスタの検討(該当する場合)
シャーディングが必要になるのは、次のような場合だ:
- 作業セットがRAMより大きい
- シングルノードのIOPSはスケーリング後も最大値
- 水平書き込みスケーリングが必要
- コレクションは1-2 TBを超える
詳しくは、 パフォーマンス・チューニングと シャーディングを 参照のこと。
デプロイメントがシャーディングを使用している場合は、実行してください:
sh.status()
をチェックする:
- 不均等なチャンク分布
- ジャンボチャンク
- 単一シャードに集中するトラフィック
推奨される行動
- シャードキーの選択を見直す。
- シャード・キーが単調に増加するのを避ける。
- ハッシュ化されたシャード・キーを考えてみよう。
不適切なシャード・キーの選択は、スケール時のパフォーマンスに大きな影響を与える可能性がある。
ステップ6:大容量データ削除後
かなりの割合のデータを削除しても、オペレーティングシステムレベルのディスク使用量はすぐには減らない。
考えられる影響
- 内部の断片化
- 高いディスク使用率
- パフォーマンスの低下
推奨される行動
- 締固め作業は慎重に計画すること。
- 深刻なフラグメンテーションに対しては、ダンプとリストアを検討する。
- ディスク使用率を80~85%以下に保つ。
保守活動のスケジュールを適切に立てる。
ステップ7:ロックの競合をチェックする
ロックの競合は、同時処理と全体のスループットに深刻な影響を与える可能性がある。
-
グローバルロックの統計情報を確認する:
db.serverStatus().locks -
ロックのために現在のオペレーションをチェックする:
db.currentOp({ $or: [ { waitingForLock: true }, { "locks.Global": "w" } ] }) -
ロックの待ち時間を分析する:
db.serverStatus().globalLock
何を探すべきか:
currentQueue価値観が高い(読書家または作家)。waitingForLock: true。- ロックを保持する長時間オペレーション。
- 操作をブロックするインデックスの構築。
一般的な原因
- 適切なインデックスのない長時間クエリ。
- 大きな書き込み操作。
- インデックスは大規模なコレクションを構築する。
- 管理コマンド (compact, repairDatabase )。
推奨される行動
- 必要であれば、長時間実行されているオペレーションを停止させる:
db.killOp(opid) - バックグラウンドでインデックスを構築する:
db.collection.createIndex({ field: 1 }, { background: true }) - 大規模な作業を小分けにする。
- 交通量の少ない時間帯に整備作業を行う。
- 懸念の読み取りと書き込みを適切に使用する。
ステップ8:作業負荷パターンの分析
ワークロードのパターンを理解することは、最適化の機会を特定するのに役立ちます。
-
動作カウンターをチェックする:
db.serverStatus().opcounters -
時系列でオペレーションを分析する:
db.serverStatus().opcountersRepl -
ホットなコレクションを特定する:
db.adminCommand({ top: 1 }) -
読み取り比率と書き込み比率を比較する:
var stats = db.serverStatus().opcounters; print("Read ratio: " + (stats.query + stats.getmore) / (stats.query + stats.getmore + stats.insert + stats.update + stats.delete));
何を探すべきか:
- 特定のコレクションに対する不均衡なオペレーション
- 高い読み書き比率
- 運転回数の急激な増加
- 時間ベースのパターン(ピーク時)
推奨される行動
- 頻繁にアクセスされるコレクションを最初に最適化する。
- 読み込みの多いワークロードには、読み込みレプリカを検討する。
- 適切な読み取り設定を使用する。
- 頻繁に読み込まれるデータのキャッシュを実装する。
- ホットコレクションのインデックス戦略を見直す。
- 書き込みの多いコレクションにはシャーディングを検討する。
ステップ9: メモリの圧迫とキャッシュ効率の調査
MongoDB's WiredTiger ストレージエンジンはキャッシュ効率に大きく依存している。
-
WiredTiger キャッシュ統計情報を確認する:
db.serverStatus().wiredTiger.cache -
主要指標を見直す:
var cache = db.serverStatus().wiredTiger.cache; print("Cache size: " + cache["bytes currently in the cache"]); print("Max cache size: " + cache["maximum bytes configured"]); print("Pages read into cache: " + cache["pages read into cache"]); print("Pages written from cache: " + cache["pages written from cache"]); print("Cache hit ratio: " + (1 - cache["pages read into cache"] / (cache["pages read into cache"] + cache["pages requested from the cache"]))); -
立ち退き圧力をチェックする:
db.serverStatus().wiredTiger.cache["pages evicted by application threads"]
何を探すべきか:
- キャッシュヒット率95%以下
- 高い立ち退き率
- キャッシュサイズは常に最大
- 立ち退きを実行するアプリケーション・スレッド
作業セットのサイズを見積もる:
db.serverStatus().wiredTiger.cache["tracked dirty bytes in the cache"]
推奨される行動
- キャッシュが常に満杯の場合は、より多くのメモリを持つプランにスケールする。
- インデックスの見直しと最適化(未使用インデックスの削除)。
- クエリの結果セットのサイズを制限する。
- 投影を使用してドキュメントサイズを縮小する。
- 古いデータのアーカイブを検討する。
- 作業セットのサイズの傾向を監視する。
メモリ割り当てのベストプラクティス
- WiredTiger キャッシュは、利用可能な RAM の 50%であるべきである(デフォルト)。
- 他のプロセスのために十分なメモリを残しておく。
- スワップ使用量を監視する。
ステップ10:書き込みに関する設定と読み出しに関する設定を見直す
書き込みの懸念と読み込みの優先設定は、パフォーマンスと一貫性に大きく影響する。
-
現在の書き込みの懸念を確認する:
db.getWriteConcern() -
レプリカセットの設定を確認する:
rs.conf() -
懸念事項を書き込む:
懸念事項の書き込みオプション 懸念事項を書く 耐久性 パフォーマンス ユース・ケース w: 1低 高 重要でないデータ、高いスループット w: "majority"高 中 デフォルト、バランスの取れたアプローチ w: <number>ミディアム-ハイ ミディアム-ロー 特定のレプリカ数 j: true最高 最低 ジャーナル同期が必要な重要データ -
プリファレンスのオプションを読む:
プリファレンス・オプションを読む プリファレンスを読む 整合性 パフォーマンス ユース・ケース primary最高 中 デフォルト、強い一貫性 primaryPreferred高 ミディアム-ハイ セカンダリーへのフォールバック secondary結果 高 分析、レポート secondaryPreferred結果 高 スケーリングを読む nearest結果 最高 最低のレイテンシー -
お申し込みの際、read preferenceにチェックを入れてください:
// Example in Node.js driver db.collection('users').find({}).readPreference('secondary')
何を探すべきか:
- クリティカルでないデータの書き込みに関する懸念が厳しすぎる
primary、最終的な一貫性が許容される場合に優先読み込みを使用する- 読み取り負荷の高いワークロードにセカンダリを活用しない
推奨される行動
- 高スループットでクリティカルでない書き込みには
w: 1。 - 重要なデータには
w: "majority"を使用する(デフォルト)。 - アナリティクスのクエリーには、
secondaryまたはsecondaryPreferredを使用してください。 - 地理的に分散したアプリケーションのために、
nearest。 - 一貫性の要件とパフォーマンスのニーズのバランスをとる。
- さまざまな構成を負荷をかけてテストする。
ステップ11:バックアップとメンテナンスの影響を監視する
バックアップ作業やメンテナンス作業は、一時的にパフォーマンスに影響を与える可能性があります。
IBM Cloud バックアップスケジュール
Databases for MongoDB は自動的にバックアップを行う。 IBM Cloud、コンソールの「 Backups 」でバックアップスケジュールを確認してください。
進行中のバックアップ操作を確認する:
db.currentOp({
$or: [
{ op: "command", "command.backup": { $exists: true } },
{ desc: /^conn/ }
]
})
何を探すべきか:
- バックアップウィンドウのパフォーマンス低下
- バックアップ時のディスクI/Oの増加
- バックアップ時のレプリケーション・ラグ
推奨される行動
- バックアップ時間中のパフォーマンス・メトリクスを監視します。
- バックアップが常にパフォーマンスに影響を与える場合は、スケーリングを検討してください。
- バックアップ保持ポリシーを見直す。
- リストア作業中のリソース使用量の増加を計画する。
メンテナンス業務のベストプラクティス
- トラフィックの少ない時間帯にインデックスを作成する。
- 可能な限り、バックグラウンドのインデックスビルドを使用する。
- メンテナンス中のレプリケーションラグを監視する。
- まず非本番で保守作業をテストする。
- IBM Cloud、メンテナンス窓口を調整する。