質問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, 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;
//システムメモリ使用状況を調査するコマンド