FE / コーディネーターノードのメモリ不足問題のトラブルシューティング
「FEメモリ不足」の問題を防ぎ、迅速に回復し、再発防止のためにできる限り原因を特定します。
注記
- この情報はFEノードおよびコーディネーターノード(共有データデプロイメント)に適用されます。読みやすさのために、両方のタイプのフロントエンドノードを「FE」と呼びます。
- この記事では主にヒープメモリの状況と解決策を分析しており、オフヒープメモリについては扱いません。OOMがオフヒープメモリの問題によって引き起こされている場合は、JVM XMXの設定を減らすか、マシンのメモリを拡張することを検討してください。
FEメモリ構造と割り当ての推奨事項
FEメモリの構成
フロントエンドサービス(FE)はJVM上で動作し、そのメモリ消費はJavaヒープとオフヒープメモリのオーバーヘッドから成ります。
JVMメモリモジュールの概要
FEプロセス中にJVMを通じて割り当てられるすべてのメモリは、大まかに以下のモジュールに分けられます:
| モジュール | タイプ | 説明 |
|---|---|---|
| Java ヒープ | ヒープ | Javaオブジェクトインスタンスのメモリ(プランキャッシュ、メタデータ、一時オブジェクトなど) |
| クラス | オフヒープ | クラスのロード時に生成されるメタデータなどの構造 |
| スレッド | オフヒープ | スレッドが占有するメモリは主に各スレッドのスタック空間です(通常、スレッドあたり約1MB)。 |
| コード | オフヒープ | JVMがバイトコードをネイティブマシンコードにコンパイルする際に占有するメモリ |
| GC | オフヒープ | ガベージコレクターの内部作業データ構造 |
| コンパイラ | オフヒープ | HotSpotコンパイラが使用するメモリはCodeと同程度になる場合があります。 |
| その他 | オフヒープ | Direct ByteBuffer、Nettyバッファなどのダイレクトメモリを含む |
| シンボル | オフヒープ | 文字列定数プール、整数定数プールなどのSymbolTable構造 |
| ネイティブメモリトラッキング(NMT) | オフヒープ | NMT自身が記録するメモリ使用量が占有するメモリ |
| アリーナチャンク | オフヒープ | JVMが一時的な保存と再利用のために内部で使用する一時メモリブロック(mallocを使用して割り当て) |
| ロギング | オフヒープ | ロギングシステム(log4jなど)が占有するメモリ |
| 引数 | オフヒープ | JVM起動パラメーターの受け渡しが占有するメモリ |
| モジュール | オフヒープ | Javaモジュールシステムで使用される構造 |
JVMおよびStarRocksの動作特性を考慮すると、FEのメモリは主に以下の部分で構成されます:
-
JVMヒープメモリ(ヒープ)
- Javaオブジェクトインスタンス(Plan Cache、メタデータキャッシュなど)を格納します。
- 最大サイズはパラメータ
-Xmxで設定され、ガベージコレクションメカニズムに大きく影響されます。
-
非ヒープメモリ(Metaspace)
- ストレージクラス定義、定数プールなどのメタデータ。
- Java 8以降でPermGenに置き換わりました。
-
ダイレクトメモリ
- Netty、ByteBuffer、ログバッファ、RPCフレームワークなどが使用するオフヒープメモリ。
sun.misc.Unsafeによって割り当てられ、通常はGCによって制御されません。
-
スレッドスタックメモリ
- 各Javaスレッドは作成時にスレッドスタックを要求し、 デフォルトサイズは約1MB(
-Xssで設定可能)です。 - スレッド数が多い場合(高並列シナリオなど)、メモリの積み上がりが発生しやすくなります。
- 各Javaスレッドは作成時にスレッドスタックを要求し、 デフォルトサイズは約1MB(
-
JNI / ネイティブメモリ呼び出し
- データベースは、ロギングコンポーネント(RocksDB、Nettyなど)、Cacheなどを通じてネイティブレイヤーを呼び出す際にメモリを消費する場合があります。
JVMパラメータ設定の推奨事項
JVMでは、ヒープメモリは Xmx で設定します。一般的に、プロセスが使用するメモリが Xmx の130%未満であることが適切です。つまり、JVM Xmx で設定されたメモリに加えて、一部のオフヒープメモリも使用されます。例えば、JVMに21gを設定した場合、top で確認できるプロセスのRSSメモリ使用量は約27gになります。
経験に基づくと、タブレット数とFEメモリの推奨関係は以下の通りです:
| タブレット数 | 推奨FEメモリ設定 |
|---|---|
| 1M未満 | 16 GB |
| 1M - 2M | 32 GB |
| 2M - 5M | 64 GB |
| 5M - 10M | 128 GB |