序文 Java と Docker の組み合わせにより、アプリケーションのパッケージ化の問題がより適切に解決されました。しかし、互換性がない部分もあります。たとえば、Java は Docker によって設定されたメモリ制限と CPU 制限を自動的に検出できません。 これにより、JVM はビジネスに安定して対応できなくなります。コンテナは JVM プロセスを強制終了し、ヘルス チェックによって JVM プロセスがプルアップされるため、ポッドが 1 日に何百回も再起動する可能性があることを監視できます。 Java プロセスがコンテナ内で実行されるときに、Kubernetes YAML 記述ファイルでコンテナと JVM パラメータを毎回構成しなくても、Java がコンテナの制限を自動的に識別し、正しいメモリと CPU 情報を取得できるようになることを期待しています。 JVM MaxRAM パラメータまたは JVM パラメータを使用して実験的な機能のロックを解除し、JDK を 10 以上にアップグレードすると、この問題を解決できます (おそらく~.~)。 まず、Docker コンテナは本質的にはホスト マシン上のプロセスです。ホストマシンと /proc ディレクトリを共有します。つまり、コンテナ内で表示される /proc/meminfo と /proc/cpuinfo は、以下に示すように、ホスト マシン上で直接表示されるものと一致しています。 ホスト
容器
では、Java はどのようにしてホストのメモリ情報を取得するのでしょうか?そうです、/proc/meminfo を通じて取得されます。 デフォルトでは、JVM の最大ヒープ サイズはシステム メモリの 1/4 です。システムが 8G の場合、JVM のデフォルトのヒープは約 2G になります。 Docker は CGroups を使用してメモリを制限し、/proc ディレクトリは読み取り専用形式でコンテナーにマウントされます。デフォルトでは、Java は CGroups によって制限されるメモリ サイズをまったく認識できず、起動時のメモリ情報として /proc/meminfo の情報を使用します。この非互換性により、コンテナに割り当てられたメモリが JVM のメモリよりも少ない場合、JVM プロセスが強制終了されます。 互換性のないメモリ制限 まず、一連のテストを見てみましょう。ここでは、188G のメモリを搭載した物理マシンを使用します。
以下のテストでは、openjdk のホットスポット仮想マシンと IBM の openj9 仮想マシンを使用します。 次のテストでは、正しく安全であると識別された JDK (つまり、コンテナの制限を超えず、強制終了されない) と、誤って危険であると識別された JDK と呼びます。 テストケース1 (OPENJDK) この一連のテストでは、最新の openjdk8-12 を使用し、コンテナ メモリを 4G に制限し、JDK のデフォルト パラメータでの最大ヒープを確認します。デフォルトのパラメータで安全な JDK のバージョンがいくつあるか確認してみましょう。 コマンドは以下のとおりです。試してみたい場合は、コマンドを使用できます。
OpenJDK8 (コンテナ制限を認識しない、26.67G) 危険
OpenJDK8 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap (コンテナ制限を正しく識別、910.50M) 安全性
OpenJDK 9(コンテナ制限を認識していない、26.67G)は危険です
OpenJDK 9 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap (コンテナ制限を正しく識別、1G) 安全性
OpenJDK 10 (コンテナ制限の正しい識別、1G) セキュリティ
OpenJDK 11 (コンテナ制限の正しい識別、1G) セキュリティ
OpenJDK 12 (コンテナ制限の正しい識別、1G) セキュリティ
テストケース2 (IBM OPEN J9)
openjdk8-openj9 (コンテナ制限を正しく識別、3G) セキュリティ
openjdk9-openj9 (コンテナ制限を正しく識別、3G) セキュリティ
openjdk10-openj9 (コンテナ制限を正しく識別、3G) セキュリティ
openjdk11-openj9 (コンテナ制限の正しい識別、3G) セキュリティ
分析する 分析する前に、まずこのような状況を理解しましょう。 JavaMemory (MaxRAM) = メタデータ + スレッド + コード キャッシュ + OffHeap + ヒープ... 通常はヒープのみを構成します。つまり、-Xmx を使用して JVM が使用できる最大ヒープを指定します。これは、JVM が取得する最大メモリの 1/4 をデフォルトでヒープとして使用する理由でもあります。 安全性(つまり、コンテナの制限を超えてコンテナによって殺されることはありません) オープンJDK OpenJdk8-12 はこのセキュリティ機能を保証できます (8 と 9 では特別なパラメータ -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap が必要です)。 オープンJ9 2. IbmOpenJ9 のすべてのバージョンはコンテナー制限を認識できます。 リソースの利用 オープンJDK OpenJdk はコンテナの制限を自動的に識別した後、最大ヒープをコンテナ メモリの約 1/4 に設定しますが、これはメモリの大きな無駄になります。 もちろん、別の JVM パラメータを使用して *** ヒープを設定することもできます。 -XX:MaxRAMFraction=int。以下は私がまとめた一般的なメモリ設定の表です。このことから、JVM のデフォルトの最大ヒープ値は MaxRAMFraction=4 であることがわかります。メモリが増加すると、ヒープのアイドル領域はますます大きくなります。コンテナ メモリが 16G の場合、Java ヒープは 4G 未満になります。
オープンJ9 OpenJ9 の詳細については、こちらをご覧ください。 OpenJ9 のメモリ利用戦略は OpenJdk よりも優れています。以下はOpenJ9ポリシーテーブルです
結論は 注: ここでは、物理マシンのメモリとは異なるコンテナのメモリ制限について説明します。 自動 -Xmx を明示的に指定せずに、Java プロセスがコンテナーの制限を自動的に検出できるようにしたい場合。 1. JVM プロセスをコンテナによって強制終了されることなくコンテナ内で安全かつ安定して実行する必要がある場合、JDK バージョンが 10 未満の場合 (JDK10 以上のバージョンを設定する必要はありません。前のテストを参照してください)、メモリの問題により Java プロセスがコンテナによって強制終了されないように、JVM パラメータ -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap を追加で設定する必要があります。もちろん、この方法は使い方が簡単で信頼性が高いですが、欠点も明らかです。リソースの使用率が低すぎるのです (前の表の MaxRAMFraction=4 を参照)。 2. メモリ リソースの使用率を向上させたい場合、コンテナ メモリが 1 GB ~ 4 GB の場合は、-XX:MaxRAMFraction=2 を設定することをお勧めします。コンテナ メモリが 8 GB を超える場合は、-XX:MaxRAMFraction=1 の設定を試してください (上記の表を参照)。 マニュアルトランスミッション 手動送信エクスペリエンスを希望し、メモリ リソースをさらに活用する場合は、手動構成時代 -Xmx に戻る必要がある場合があります。マニュアルトランスミッション部分については、上記の私のBBを完全に無視してください。 1. 上記では、非常にシンプルで使いやすい自動設定について説明しました。コンテナの制限は自動的に検出されるため、-Xmx の構成について心配したり考えたりする必要はありません。 2. たとえば、1G のメモリがある場合は -Xmx750M、2G の場合は -Xmx1700M、4G の場合は -Xmx3500-3700M、8G の場合は -Xmx7500-7600M に設定することをお勧めします。つまり、JVM のその他のメモリ用に少なくとも 300 MB のメモリを予約する必要があります。ヒープが特に大きい場合は、1G または 2G を予約できます。 3. マニュアルトランスミッションはそれほど使い心地は良くありませんが、当然ながらリソースの利用率は比較的高くなります。 |
<<: 仮想化プラットフォームが 3 分で何ができるのか理解できますか?
>>: なぜ人々はクラウド コンピューティングを十分に信頼しないのでしょうか?
可観測性 - 鳥瞰図前の記事で述べたように、可観測性とは、システムによって生成された外部データ (ロ...
前回の周旭生の記事では、「初心者が身につけるべきウェブサイト診断と最適化のスキル」を紹介しました。前...
dotvps は、3G メモリ、月額 7 ドル、オプションのデータ センター 4 つ、openvz ...
Huawei Cloud Distributed Cache Redis サービスは、Redis と...
今日、情報技術は絶えず発展しています。そして、この技術の進歩は猛烈な勢いで進み続け、より高速な処理と...
近年、インターネットのイノベーションは、消費者向けインターネットから産業向けインターネットへと変化し...
社内でプロモーション業務をしていたため、ソフトな記事を書く必要があったのですが、公開プラットフォーム...
蘭州SEOのヤン・ファン氏はかつて、「ウェブサイトのランキングを迅速に向上させるキーワードの選択」と...
この疫病によりデジタル化の早送りボタンが押され、より多くの企業がデジタル変革の重要性と緊急性を認識す...
uuuvps (登録番号 2869262、ID はこちらをクリック) は国慶節と中秋節を祝います。当...
1. 百度が2012年の年間検索ランキングを発表百度は2012年の年間検索チャートを発表した(htt...
インターサーバー(1999年~)は、米国ニューヨークのデータセンターでストレージスペースサービスを提...
企業はクラウド プラットフォームに移行しており、CIO はセキュリティに関する考え方を変える必要に迫...
[[342084]]この記事はWeChatの公開アカウント「Dotnet Plus」から転載したもの...
Vultr VPS は、VPS 構成の包括的なアップグレードと価格の引き下げという変更を開始していま...