この項では、メモリー領域、ディスク領域、ファイル記述子、セマフォなどの特定のリソースをTimesTenが使い果たしたときに確認する事項を説明します。
状態
|
対処
|
---|---|
メモリー領域を使い果たす | |
ディスク領域を使い果たす | |
ログ領域を使い果たす | |
ファイル記述子を使い果たす | |
セマフォを使い果たす | |
CPUを使い果たす | スタック・トレースを取得して、テクニカル・サポートに連絡する |
エラー・メッセージに、拡張または補充する必要のあるリソースが示されます。メッセージに従って、システムを再構成します。
データ・ストアには十分な空き領域があるように見えても、問合せを実行するとデータ・ストア領域を使い果たしてしまう場合は、ttOptUpdateStatsまたはttOptEstimateStatsプロシージャを使用して、オプティマイザの統計データが更新されていることを確認します。問合せの中には、実行時に一時領域の割当てが必要なものがあります。必要な一時領域の量は、問合せに使用する表の統計から見積もられます。正しい統計データがないと、必要な一時領域が少なく見積もられることがあります。
問合せの最適化の詳細は、「問合せオプティマイザの使用」を参照してください。
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のデータ・ストアのサイズ指定に関する説明で説明するとおり、TimesTenでは、永続データ・パーティションと一時データ・パーティションの両方を使用します。これらのパーティションに割り当てられるメモリーの量は、データ・ストアのDSN定義のPermSizeおよびTempSize属性で設定されます。
TimesTenデータ・ストアが一杯になった場合、永続セグメントと一時セグメントのどちらが一杯かを判断することが重要です。ttIsql dssizeコマンドを使用して、永続データ・パーティションおよび一時データ・パーティションについて、割当てサイズ、使用中のサイズおよび最高水位標サイズをリストできます。永続セグメントは表および索引データで構成され、一時セグメントは、ロック、ソート領域、コンパイル済コマンドなどの内部構造で構成されています。
データ・ストアのサイズを見積もる際のヒントについては、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のデータ・ストアの正しいサイズ調整に関する説明を参照してください。
永続セグメントが一杯になっている場合は、データ・ストアの圧縮(「データ・ストアを圧縮する」を参照)が役立つ可能性があります。それでも永続セグメントが一杯のままなら、単にデータ量が多すぎるという可能性があります。既存の索引に破棄できるものがないかどうか検討してください。実際に使用されている索引は、問合せ計画を参照するとわかります(問合せ計画の生成方法については、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のttIsqlユーティリティの使用に関する説明にある、問合せオプティマイザ計画の参照と変更の説明を参照)。
また、ttSizeユーティリティを使用して、データ・ストア内の各表が使用するメモリーの量を見積もることもできます。格納する必要のあるデータ量が多すぎる場合は、データ・ストアのPermSize属性を再設定して、永続セグメントのサイズを大きくする必要があります。たとえば、メモリー・セグメントのサイズに制限があるために、一時セグメントを縮小したり、データ・ストアを拡大することができない場合、かわりに、データを複数の異なるデータ・ストアに分割する必要があります。
永続セグメントが一杯になったときに、データ・ストアからデータをコピーして取り出し、データをすべて削除してから圧縮し、その後データを元に戻すことで、領域を解放することもあります。この作業は、ttMigrateユーティリティを-noRepUpgradeオプションとともに使用し、データを外部へ移行した後、データ・ストアを破棄してから再作成し、データを元に戻すことによって、より効率的に行うことができます。この操作の詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のデータ・ストア・サイズの縮小に関する説明を参照してください。
最後に、プロセスにより多くの量の共有メモリーが割り当てられるように、オペレーティング・システムを構成する必要がある場合があります。また、仮想メモリーにより多くのスワップ領域を割り当てる必要があることもあります。詳細は、後述の「使用可能なスワップ領域(仮想メモリー)を確認する」を参照してください。
一時セグメントが一杯になっている場合、前述のとおり、データ・ストアの圧縮が役立つことがあります。それでも効果がない場合は、統計が古いために、いくつかのコマンドで割り当てている領域が多すぎる可能性があります。コマンドが確実に再準備されるように無効化パラメータを設定してttOptUpdateStatsまたはttOptEstimateStatsプロシージャをコールすることで、表の統計を更新してみてください。
統計を更新しても一時セグメントのメモリーの使用量が減らない場合は、すべての接続を切断してから、再接続します。すべての接続が切断されたかどうかは、ttStatusで確認できます。コマンドを再準備する必要はありますが、これですべての一時領域が解放されます。
問題が繰り返し発生する場合は、データ・ストアを監視して問題の原因を特定できます。ttWarnOnLowMemoryプロシージャを使用して、データ・ストアが一杯になったかどうかを示すデーモン・ログの警告を有効にできます。
スワップ領域を使い果たしたことを示すエラーを受け取った場合は、使用可能なスワップ領域(仮想メモリー)の量を増やす必要があります。
UNIXシステムの場合は、swapコマンドを使用して、現在システムに対して設定されている仮想メモリーの量を確認し、再設定できます。
Windowsシステムの場合は、「コントロール パネル」→「システム」→「詳細」を選択して、仮想メモリーのサイズを確認し、再設定できます。
6.0より前のリリースでは、TimesTenアプリケーションは、断片化を減少させ、領域を最も効率的に使用するために、データ・ストアを定期的に圧縮する必要がありました。リリース6.0からは、内部メモリーの割当てルーチンによって、領域の最適な使用が自動的に行われるようになりました。明示的な圧縮は必要ありません。
内部メモリーの割当てアルゴリズムの技術は、特に動的システムの場合は複雑です。トランザクション・セマンティクスと様々なパフォーマンスの最適化は、ある時点でのメモリーの状態を不完全なものにする場合があります。たとえば、データベース操作が1000の行ロックを取得した場合、ロックが解放されても、その領域はすぐには解放されないことがあります。大量のロックが続いて取得されるような場合、この領域を再利用することが効率的である可能性があります。TimesTenは、未使用のすべてのロック・メモリーを定期的に解放し、未使用のSQLコマンドをクリーンアップしますが、現在でも、ある時点のメモリー使用量の正確なレポートを作成するために、圧縮ルーチンを明示的に使用できます。ただし、断片化の除去を目的とした圧縮は必要なくなりました。
ttIsql圧縮コマンドまたはttCompactプロシージャを使用して、現在解放できるすべてのメモリーのクリーンアップと圧縮を実行できます。これによって、収集されるメモリー使用量の統計は、より正確なものになります。
ここで注意が必要なのは、暗黙的または明示的であるかに関係なく、圧縮操作では使用中の項目は再配置されないということです。このため、2つの隣接したメモリー領域がそれぞれ半分のみ満杯になっている場合、使用中の項目を一方から他方に移動して、一方を開放するということは行われません。このような領域を開放するには、noRepUpgrade
オプションを指定してttMigrateユーティリティを使用すると、データ・ストアを保存およびリストアします。詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のデータ・ストアのサイズの縮小に関する説明を参照してください。
『Oracle TimesTen In-Memory Database概要』のチェックポイント処理に関する説明で説明するとおり、TimesTenは、データ・ストア属性で指定されているディレクトリに格納されている2つのチェックポイント・ファイルのいずれかにデータ・ストアのコピーを保存します。各チェックポイント・ファイルはディスク上で大きくなり、共有メモリー内のデータ・ストアのサイズと同等になる可能性があります。各永続データ・ストアについて、2つのチェックポイント・ファイルとログ・ファイル(ディスクへのロギングが有効な場合)を保存するための十分なディスク領域が必要です。
ログ・ファイルはLogDir属性で指定されたディレクトリに蓄積され、チェックポイントが実行されたときにのみ削除されます。DSNにLogDir属性が指定されていない場合は、データ・ストア属性で指定されたディレクトリにログ・ファイルが蓄積されます。ログ・ファイルの最大サイズは、LogFileSize属性で設定されます。
ディスクがTimesTenデータで一杯になる原因のほとんどは、ログ・ファイルの蓄積です。TimesTenでは、チェックポイント処理、バックアップ、レプリケーションなどの様々な目的でログ・ファイルが使用されます。どの操作がログ・ファイルを保持するかを特定することが重要であり、これによって、ログ・ファイルを適切にパージできるように適切なアクションをとることができます。これは、ttLogHolds組込みプロシージャを使用して行います。ログの保持には6つのタイプがあります。次の説明を参照してください。
多数の行を削除するトランザクションがアプリケーションにあるときは、一時ディレクトリがあるディスクで、領域を余分に解放する必要がある場合があります。トランザクションによってデータ・ストアの大きな領域が解放されたときに、TimesTenでは一時ファイルを作成します。データ・ストアの一時データ・パーティションのサイズ変更については、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のデータ・ストアのサイズ変更に関する説明を参照してください。一時ディレクトリの場所は変更できます。それには、WindowsではTMP環境変数、UNIXではTMPDIR環境変数を設定します。詳細は、「ttRepAdmin -duplicate実行時の問題」を参照してください。
ディスクの使用には、次の2つのTimesTen属性が関係します。
.arch
を付加して、不要になったログ・ファイルの名前を変更します。名前を変更した後は、不要になったときに手動でログ・ファイルを削除する必要があります。ログ・ファイルをパージしないと、TimesTenで不要になったときも、ログ・ファイルが蓄積され続けて領域を浪費します。IPCとしての共有メモリー・セグメントを許可するように構成されたTimesTenデータ・ストアに対する複数のクライアント/サーバー接続を作成する場合、TimesTenでセマフォを作成できなかったことを示すエラーが発生することがあります。
Solarisでは、次のコマンドで現在のセマフォの制限を確認できます。
% sysconfig -q ipc
プロセスごとに7つ以上のShmIpcクライアントDSN接続が必要な場合は、セマフォの数を増加する必要があります(『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のセマフォの数の増加に関する説明を参照)。