パフォーマンスのトラブルシューティング Databases for MongoDB

このガイドを使用して、 IBM Cloud 上で実行され、 MongoDB によって供給される Databases for MongoDB 展開におけるパフォーマンスの問題を特定し、解決してください。

また、パフォーマンスに関する問題の解決方法については、以下のページをご参照ください:

アプリケーションの応答が遅い、タイムアウトが発生する、またはデータベースのパフォーマンスが安定しない場合は、以下の手順と情報を検討してください。

パフォーマンス問題の症状

パフォーマンスの問題を示す以下のような症状が見られるかもしれません:

  • アプリケーションの待ち時間の増加
  • クエリログのエントリが遅い
  • CPUまたはメモリの使用率が高い
  • ディスクの待ち時間の増加
  • レプリケーション・ラグ
  • 接続タイムアウト

以下のステップを完了し、問題の原因を特定する:

ステップ1:リソースの利用状況を確認する

  1. IBM Cloud コンソールにログインし、 MongoDB 配置に移動します。

  2. モニタリングのセクションを見直す:

    • CPU 使用率
    • メモリー使用率
    • ディスクのIOPSとレイテンシー
    • アクティブ接続数

何を探すべきか:

  • CPUが常に75%以上
  • メモリは常に80%以上
  • 時間とともに増加するディスクの待ち時間
  • プランの限界に近づくコネクション

推奨される行動

  • ディスクのレイテンシーが高い場合は、ストレージまたはIOPSを増やす。
  • アプリケーションのワークロード急増を見直す。

リソースの使用量が高い状態が続く場合は、スケーリングすることを推奨する。

ステップ2:遅いクエリを特定する

遅いクエリは、パフォーマンス低下の最も一般的な原因の1つです。

  1. プロファイリングを有効にする:

    db.setProfilingLevel(1, { slowms: 100 })
    
  2. 最近の低調なオペレーションを見直す:

    db.system.profile.find().sort({ ts: -1 }).limit(20)
    
  3. クエリの実行を分析する:

    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、メンテナンス窓口を調整する。