高負荷の問題 高負荷なシナリオは、以下の症状によって、認識できます。 :
- ユーザー要求が成功しない。
- データベースが多重のタイムアウトを発生させ、 "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)
|