問題1:テナントのメモリ制限を超えた場合はどうすればよいですか?
ERROR 4030 (HY000): OB-4030:Over tenant memory limits。
上記のエラーメッセージが表示された場合、まずMemStoreのメモリが上限を超えていないか判断する必要があります。MemStoreのメモリが上限を超えている場合は、データ書き込みが過剰であるか、または制限がかけられていないか確認する必要があります。大量の書き込みが発生し、データダンプの速度が書き込み速度に追いつかない場合にこのエラーが報告されます。以下のステートメントを実行して、現在のメモリ使用状況を確認します:
obclient> SELECT /*+ READ_CONSISTENCY(WEAK),query_timeout(100000000) */ TENANT_ID,SVR_IP,
round(ACTIVE_SPAN/1024/1024/1024,2) ACTIVE_GB,
round(MEMSTORE_USED/1024/1024/1024,2) TOTAL_GB,
round(FREEZE_TRIGGER/1024/1024/1024,2) FREEZE_TRIGGER_GB,
round(MEMSTORE_USED/FREEZE_TRIGGER*100,2) percent_trigger,
round(MEMSTORE_LIMIT/1024/1024/1024,2) MEM_LIMIT_GB
FROM oceanbase.GV$OB_MEMSTORE
WHERE tenant_id >1000 OR TENANT_ID=1
ORDER BY tenant_id,TOTAL_GB DESC;
この問題の緊急対処法は、テナントメモリの増量です。具体的な操作については、テクニカルサポートにお問い合わせください。問題が解決した後は、原因を分析する必要があります。制限がかけられていないことが原因である場合は、適切な措置を講じた上で、以前に追加したテナントメモリの操作をロールバックする必要があります。業務規模の拡大によりテナントメモリが業務を支えるには不十分な場合は、ダンプの頻度に応じて適切なテナントメモリサイズを設定する必要があります。MemStoreのメモリが上限を超えていない場合、以下のステートメントを実行して、どのメモリモジュールが上限を超えているか判断します:
obclient> SELECT tenant_id, svr_ip, sum(hold) module_sum
FROM oceanbase.GV$OB_MEMORY
WHERE tenant_id>1000 AND hold<>0 AND
CTX_NAME NOT IN ('KVSTORE_CACHE_ID','MEMSTORE_CTX_ID')
ORDER BY tenant_id, svr_ip DESC;
メモリモジュールが上限を超えているかどうかの判断基準は module_sum > (テナント memory_size - テナントMemStore)です。モジュールメモリが上限を超えている場合は、まず個々のモジュールのメモリを調整する必要がある可能性があります。例えば、ob_sql_work_area_percentage の値を調整します。テナントメモリが小さすぎる場合も、テナントメモリを増量する必要があります。
システム変数名 |
説明 |
デフォルト値 |
生效范围 |
|---|---|---|---|
ob_sql_work_area_percentage |
テナントのワークエリアメモリ。SQLソートなどのブロッキング演算子が使用するメモリ。 | 5% | Global |
問題2:PLANCACHEヒット率が90%未満の場合はどうすればよいですか?
OLTPシステムでは、PLANCACHEのヒット率は90%以上である必要があります。以下のステートメントを実行して、PLANCACHEのヒット率を確認します:
obclient> SELECT hit_count,executions,(hit_count/executions) as hit_ratio
FROM V$OB_PLAN_CACHE_PLAN_STAT
WHERE (hit_count/executions) < 0.9;
obclient> SELECT hit_count,executions,(hit_count/executions) AS hit_ratio
FROM V$OB_PLAN_CACHE_PLAN_STAT
WHERE (hit_count/executions) < 0.9 AND executions > 1000;
類似のステートメント、例えば in または not in の後のパラメータ数がランダムになり、大量の無駄遣いが発生していないか確認します。上記の場合ではない場合、業務量やセッションの急増によりメモリ不足が原因である可能性があります。テナントメモリサイズを調整する必要があります。
問題3:ログに「fail to allocate memory」や「allocate memory fail」といった情報が含まれている場合はどうすればよいですか?
ログには tenant_id(テナント番号)と context(メモリモジュール)の情報が含まれています。以下のステートメントを実行して、具体的なメモリモジュール情報を照会できます:
obclient> SELECT * FROM oceanbase.GV$OB_MEMORY WHERE CTX_NAME =xxx AND tenant_id = xxx;
問題1からわかるように、モジュールメモリが上限を超えている場合は、まず個別モジュールのメモリを調整する必要があります。テナントメモリが小さすぎる場合は、テナントメモリを増量する必要があります。具体的な操作については、テクニカルサポートにお問い合わせください。
問題4:テナント500のメモリが上限を超えた場合
tenant_id =500 のテナントはOB内部テナントで、略して500テナントと呼ばれます。通常、このエラーは複数回発生し、最も可能性の高いのはマシンのシステムメモリが使い果たされたか、現在のマシンの残りメモリが事前に割り当てられており、ユーザーが拡張できない場合です。
この種のエラーでは、メモリの使用状況を確認する必要があります。500テナントのメモリ使用量は V$OB_MEMORY の統計には含まれていないため、oceanbase.GV$OB_MEMORY テーブルを照会する必要があります。同時に、システム全体のメモリ使用状況も調査する必要があります。マシンのシステムメモリが使い果たされている場合は、システムの偶発的な状況かどうか判断します。もしそうで、かつ業務への影響がない場合は、システムが自動的にメモリを解放するのを待つことができます。大きな業務への影響や、システムの正常なプロセス活動によるメモリの使用、メモリの事前割り当てなどが原因である場合は、メモリの増量を検討することができます。具体的な操作については、テクニカルサポートにお問い合わせください。
SELECT * FROM oceanbase.GV$OB_MEMORY WHERE tenant_id=500;
//システムメモリ使用状況を確認するコマンド