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