高負荷の問題

高負荷なシナリオは、以下の症状によって、認識できます。 :

  • ユーザー要求が成功しない。
  • データベースが多重のタイムアウトを発生させ、 "transaction aborted" メッセージを表示する。
  • 履歴ファイルに、 "HIGH LOAD" 警告が、たびたび出力されている。
  • 散在的に障害が起きる。

高負荷の問題があると疑わしい場合は、以下のことを考慮してください。 :

  • タプルログが領域外にあるか ?
  • ノード内部のログが、上限値に達しているか ?
  • ロックの数が上限値に達しているか ?
  • いく通りかのパフォーマンスチューニングを行うことによって、問題を解決できるか ?

注 : CPU の使用可能な処理能力を、より強力にすることによって、それら問題のすべてを、たびたび解決出来る事があります。

タプルログが領域外にあるか ?

ユーザー操作の全て (delete, insert, update) が、タプルログに出力され、そして実行されます。それらタプルログが、満杯になってしまう事が想定されます。なぜなら :

  • CPU 又は、 ディスク I/O の競合が原因で、実行速度が遅くなる。
  • log の記録を受信することにおける、そのミラーノードの速度低下は、結果として以下のことが発生しえる :\
    • ネットワークの競合によって、ミラーノードにログの記録が届かない。
      \
    • ミラーノードでの CPU とディスクの競合は、 処理が、ログの記録 ( 履歴ファイル上の "log throw due to..." メッセージ ) を素早く受信したことを、保持し続ける。
      \タプルログが、領域外の場合、履歴ファイルはタプルログ上に、 HIGH LOAD を含むメッセージを表示します。
  • 解決方法 1
    [CPU 利用の改善|./TSG_HADBProblemsJa08.html">http://wiki.glassfish.java.net/Wiki.jsp?page=TSG_HADBProblemsJa08] 記事にあるとおり、 CPU の利用状況をチェックして下さい。
  • 解決方法 2
    \CPU 利用が問題ではない場合、ディスク I/O をチェックして下さい。ディスク競合が見られる場合、 hadbm set DataBufferPoolSize= によって、データバッファサイズが引き上げられろことにより、ログの記録が処理される時に、ページ障害を回避します。ディスク競合が存在する場合は、次の解決方法を、推奨します。競合しているディスクがあるか ?
  • 解決方法 3
    \ネットワーク競合の証跡を見つけてボトルネックを取り除いて下さい。
  • 解決方法 4
    \タプルログバッファ hadbm set LogBufferSize= を利用 を増やしてください。

ノード内部のログが、上限値に達しているか ?

ノード内部の操作が多すぎると、 CPU 又は、ディスク I/O の問題が原因となり、スケジュールされたプロセスが処理されません。
\ノード内部のログが、領域外である場合、履歴ファイルは、ノード内部のログが、高負荷であることを表示しているメッセージを保存します。

  • 解決方法 1
    [CPU 利用の改善|./TSG_HADBProblemsJa08.html">http://wiki.glassfish.java.net/Wiki.jsp?page=TSG_HADBProblemsJa08] 記事にあるとおり、 CPU の利用状況をチェックして下さい。
  • 解決方法 2
    \CPU 利用が問題ではない場合、ディスク I/O をチェックして下さい。ディスク競合が見られる場合、 hadbm の設定 DataBufferPoolSize= によって、データバッファサイズを上昇させて、ログの記録が処理されている時に、ページ障害を回避します。ディスク競合が存在する場合は、次の解決方法を、推奨します。競合しているディスクがあるか ?

ロックの数が上限値に達しているか ?

いくつかの症状は、この状態であると判断されます. :

  • エラーコード 2080 又は、 2096 がクライアントへ配信された。
  • hadbm resourceinfo --locks が、配分されたロックを表示し、常に全て利用中である。
  • 解決方法 1: 長時間かかっているトランクションを切り離す
    \トランザクションが動作しているノードでは、そのノードに配分された、ロック数上限の 25% を超えて利用することは出来ません。実行中の "repeatable read" トランザクション遮断レベルを読み込み、 update/insert/delete トランザクションが、トランザクションの完了まで、ロックを占有します。その為、長時間かかるトランザクションは、別の小規模なバッチトランザクションへ分離することが、推奨されます。
  • 解決方法 2: ロック数の上限値を引き上げる
    \Use hadbm set NumberOfLocks= を使用して、ロック数の上限値を引き上げてください。

いく通りかのパフォーマンスチューニングを行うことによって、問題を解決できるか ?

ほとんどの状況では、ロードの軽減、又は、リソースの可用性を引き上げることは、ホストパフォーマンスの向上につながります。より一般的に用いられている手順は、以下のとおりです。 :

  • より良いハードウェアの特性 ( より多くの内部メモリー、より高速なプロセッサ、より多くのプロセッサ ) を持つホスト上で、ノードを実行する。
  • 多くても、物理ディスク毎に1 つのデバイスとなるように、物理ディスクを追加し、さまざまなデバイスを利用する。
  • 新たなホスト上に、より多くのノードを追加し、新たなノードを活用するために、データを再分割する。
  • メモリーセグメント、又は、内部データ構造を大きく配分する様に、設定変更する。

併せて、パフォーマンスチューニングガイド に掲載されている、次のリソースが、 "HIGH LOAD.html" 問題を回避するために、適用可能です。 :

リソース プロパティー
データベースバッファサイズ hadbm attribute DataBufferPoolSize
タプルログバッファサイズ hadbm attribute LogBufferSize
ノード内部ログバッファサイズ hadbm attribute InternalLogBufferSize
データベースロック数 hadbm attribute NumberOfLocks

Back

日本語翻訳: jack spallaw

英文 (翻訳したバージョン: 49)