序文 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 分で何ができるのか理解できますか?
>>: なぜ人々はクラウド コンピューティングを十分に信頼しないのでしょうか?
Jinqiao.comホームページのスクリーンショット「毎月2人を雇えば、1年後には月収が少なくとも...
今から 12 月 31 日まで、sugarhosts は仮想ホストと VPS (クラウド サーバー)...
多くのウェブマスターは、SEO は主に外部リンクに関するものだと考えています。実際、近年、外部リンク...
よくSEOってどんな感じかと聞いてくる友人がいます。彼らはSEOはとても簡単で面白い仕事だと思ってい...
10月20日、2021年雲啓カンファレンスで、アリババグループ副社長兼アリババクラウドインフラストラ...
Pulse Servers は 2008 年に設立され、主に VPS 事業に従事しています。サーバー...
Ganji.comと58.comはともに変革を模索新浪テクノロジー 神雲芳2005年に設立された2つ...
Olinkcloud は中国が運営するホスティング ブランドであり、旧ブランド diahosting...
老舗ドメイン名販売業者のdomain.comがプロモーションを実施しています。すべてのドメイン名が3...
最近、私の3つのウェブサイトに変化がないことに気づいたので、状況を詳しく分析しました。SEO総合分析...
エッジ コンピューティングのユースケースは幅広く、初期の導入は高度にカスタマイズされています。インフ...
タオバオでビジネスをする場合、商品を用意した後、まず問題になるのは価格設定です。しかし、これまで多く...
[[402207]]過去1年間、感染症の流行による不確実な時期に事業成長を維持することは、多くの企業...
少し前のエルケ事件は世間の間で白熱した議論を引き起こし、インターネット上では「暴走消費」の波さえ引き...
Red Hat は、コミュニティの力を活用して、安定性、信頼性、高性能を備えたクラウド テクノロジー...