「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > AWS ECS の Java ヒープ設定の最適化

AWS ECS の Java ヒープ設定の最適化

2024 年 11 月 6 日に公開
ブラウズ:903

Optimizing Java Heap Setting for AWS ECS

AWS Elastic Container Service(ECS) Fargate でいくつかの Java サービス (Corretto JDK21) を実行しています。各サービスには独自のコンテナがあり、各プロセスに支払っている可能なリソースをすべて使用したいと考えています。ただし、この手順は EC2 や他のクラウドにも適用できます。

サービスはバッチ ジョブを実行しており、遅延は重要ではありません。並列 GC (-XX: UseParallelGC) を使用します。私たちのタスクでも G1 の方が良いかもしれませんが、それは別の研究と投稿のトピックです。
利用可能なすべてのメモリを使用するには、MaxHeapSize をコンテナのメモリ サイズより少し小さくします。しかし、しばらくしてから、2 つの問題に気づきました。コンテナーがメモリ使用量が多すぎるために強制終了される場合と、OutOfMemoryError 例外を受け取る場合があります。 1 つ目の問題を修正するために、コンテナーのメモリ サイズと MaxHeapSize の間のギャップを増やし、2 つ目の問題については、簡単な修正としてコンテナーのメモリを増やし、ヒープ ダンプの確認を開始しました。

ヒープ ダンプには興味深い詳細が示されており、実際のヒープ サイズは MaxHeapSize より小さく、若い世代のヒープは古い世代に比べて小さかったです。

インターネットで検索しても、今回のケースに合わせて JVM パラメーターを調整する方法に関する適切なガイドは見つかりませんでした。ヒープとパラメーターの説明に関する大まかな詳細しか見つかりませんでした。私が行った手順を説明するためにこの投稿を書くことにしました。

最初のステップは次のとおりです:

  • パラメータとデフォルト値に関する情報を出力: (-XX: PrintFlagsFinal)、
  • InitialHeapSize を MaxHeapSize と同じ値に設定します (-XX:InitialRAMPercentage=100 または単に -XX:InitialHeapSize を MaxHeapSize と同じ値に設定します)。いずれにせよ、すべてのコンテナ メモリに対して料金を支払っているのですから、なぜ最初から割り当てないのでしょうか?
  • GC およびヒープ情報をログに記録します (-Xlog:gc*)。

若い世代:古い世代のデフォルトの比率は 1:2 で、若い世代の一部のみが GC の実行に同時に使用されます。そして、起動後、JVM は予想どおりにすべてのメモリを割り当てましたが、しばらくすると、Young Generation ヒープ サイズが数メガバイト近くまで減少し始めました。そのため、しばらくすると、使用可能なメモリのわずか 2/3 が使用されました。
いくつか調べた結果、アダプティブ ポリシーを無効にするパラメーター (-XX:-UseAdaptiveSizePolicy) を見つけました。これが役に立ち、ヒープの減少が止まり、ガベージ コレクションの間隔が 1 桁以上増加しました。 GC にかかる時間も同様に増加しましたが、それほど大きくはありませんでした。

次のステップは、コンテナーのメモリ サイズ間の最適なギャップを見つけることでした。デフォルトでは、InitialRAMPercentage=100 であっても、JDK はメモリを割り当てるだけで使用しないため、マップされません。 Linux では、物理メモリよりも多くの仮想メモリを割り当てることができます。そして、後で実際にメモリがマップされるとき (JDK がメモリに書き込むとき)、コンテナは失敗します。 -XX: AlwaysPreTouch はこの動作を変更します。残念ながら、一部のメモリはまだマップされていませんが、OOM の終了ははるかに高速に行われます。何度か試した結果、次の式「コンテナーのメモリー サイズ - 8GB 以上のメモリーを備えたコンテナーの場合は 1024MB」で終了しました。たとえば、8192 コンテナー メモリ サイズの場合、-XX:MaxHeapSize=7168m.

を使用します。

さらなる最適化のために、-XX:NewRatio を変更して Young Generation サイズを減らし、GC 時間を短縮することを検討しています。ただし、それはアプリケーション内のオブジェクトの存続期間によって異なります。
前に述べたように、パラメーター (私が見つけた最良のものは vm-options-explorer) とチューニング手順の詳細な説明を記載した適切なガイドが見つかりませんでした。あなたの知識や結果を共有していただければ幸いです。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/mikhail-m1/optimizing-java-heap-setting-for-aws-ecs-5df6?1 侵害がある場合は、[email protected] に連絡して削除してください。それ
最新のチュートリアル もっと>
  • Django、Twilio、Pinata を使用した安全な匿名フィードバック システムの構築
    Django、Twilio、Pinata を使用した安全な匿名フィードバック システムの構築
    このガイドでは、Django、SMS 通知用の Twilio、安全なメディア アップロード用の Pinata、レスポンシブ スタイル用の TailwindCSS を使用して、安全な匿名フィードバック システムを構築する手順を説明します。このチュートリアルを完了すると、ユーザーがフィードバックを送信し...
    プログラミング 2024 年 11 月 6 日に公開
  • Tkinter エントリの get 関数が何も返さないのはなぜですか?
    Tkinter エントリの get 関数が何も返さないのはなぜですか?
    Tkinter Entry の get 関数は何も生成しません: 包括的な説明get() を使用して Tkinter Entry ウィジェットからユーザー入力を取得しようとしたとき関数を実行すると、空の戻り値が返される場合があります。この一見複雑な問題は、Tkinter の非同期の性質と関数の実行順...
    プログラミング 2024 年 11 月 6 日に公開
  • NodeJs を使用して RabbitMq を始める
    NodeJs を使用して RabbitMq を始める
    RabbitMq の紹介 RabbitMq は、異なるサービス間でメッセージを送受信できるメッセージ ブローカーです。これは、Advanced Message Queuing Protocol (AMQP) を実装するメッセージ ブローカーです。 Erlang プログラミング言語で書かれています。 ...
    プログラミング 2024 年 11 月 6 日に公開
  • ウェブをさらに接続する
    ウェブをさらに接続する
    Web のつながりをさらに高める - Infometka は「見えない Web サイト」問題をどのように解決しているか Web 開発者および ????️??????️ の作成者として、私は常に現実世界の問題を解決することに情熱を持ってきました。今日は、私が開発したソリューションを共有したいと思います...
    プログラミング 2024 年 11 月 6 日に公開
  • React を使用した Loop Studio の構築
    React を使用した Loop Studio の構築
    導入 Loop Studio は、さまざまな仮想現実 (VR) プロジェクトを紹介するために設計された没入型 Web サイトです。 React を使用すると、さまざまなコンポーネントを効率的に管理およびレンダリングして、一貫性のあるインタラクティブなユーザー エクスペリエンスを構築...
    プログラミング 2024 年 11 月 6 日に公開
  • PHP を使用して CURL で多次元配列を送信するときに発生する「配列から文字列への変換」エラーを解決する方法
    PHP を使用して CURL で多次元配列を送信するときに発生する「配列から文字列への変換」エラーを解決する方法
    CURL および PHP を使用した多次元配列の送信CURL を使用して多次元配列を含むフォーム データを送信するときに、「配列から文字列への変換」エラーが発生することがよくあります。この問題は、配列を含む配列で CURLOPT_POSTFIELDS を設定しようとすると発生します。ファイル転送を容...
    プログラミング 2024 年 11 月 6 日に公開
  • Selenium で「span:contains(\'String\')」\ による InvalidSelectorException を解決する方法
    Selenium で「span:contains(\'String\')」\ による InvalidSelectorException を解決する方法
    「span:contains('String')」による Selenium の無効な SelectorExceptionFirefox で Python の Selenium を使用するときに、 CSS セレクター「span:contains('コントロール パネル'...
    プログラミング 2024 年 11 月 6 日に公開
  • InnerHTML の落とし穴を回避して HTML をコンテナ要素に追加するにはどうすればよいですか?
    InnerHTML の落とし穴を回避して HTML をコンテナ要素に追加するにはどうすればよいですか?
    innerHTML を使用しないコンテナ要素への HTML の追加再訪当面の問題は、制限を回避しながら HTML をコンテナ要素に追加する方法です。 innerHTML プロパティを使用する場合の落とし穴。 OP が正しく指摘しているように、innerHTML は既存のコンテンツを置き換える動作によ...
    プログラミング 2024 年 11 月 6 日に公開
  • 継続的テスト: DevOps パイプラインの品質を確保する
    継続的テスト: DevOps パイプラインの品質を確保する
    継続的なテストは、最新のソフトウェア開発、特に DevOps フレームワーク内での重要な実践です。これには、コードベースに加えられたすべての変更が完全に検証されていることを確認するために、ソフトウェア配信パイプライン全体でのテストの自動実行が含まれます。開発プロセスのすべての段階にテストを統合する...
    プログラミング 2024 年 11 月 6 日に公開
  • 背景色の変更動画
    背景色の変更動画
    インスタグラムをフォローしてください このビデオチュートリアルでは、HTML、CSS、JavaScript を使用して素晴らしい Instagram カードを作成する方法を説明します。このカードには、色が変化する鮮やかな境界線、円形のプロフィール写真、およびオンラインでの存在感に魅力的なタッチを加え...
    プログラミング 2024 年 11 月 6 日に公開
  • PHPを使用してブラウザのキャッシュをクリアするにはどうすればよいですか?
    PHPを使用してブラウザのキャッシュをクリアするにはどうすればよいですか?
    PHP を使用したブラウザ キャッシュのクリアブラウザ キャッシュにより、頻繁にアクセスされるファイルがローカルに保存され、Web サイトの読み込み時間が短縮されます。ただし、キャッシュされたファイルが古い場合は、テストや開発に支障をきたす可能性もあります。この記事では、PHP を使用してブラウザの...
    プログラミング 2024 年 11 月 6 日に公開
  • Go を使用した AWS Lambda、初期定型文
    Go を使用した AWS Lambda、初期定型文
    Unsplash の Lukáš Vaňátko による写真 導入 Go はそのシンプルさから、常に私のお気に入りの言語の 1 つです。最近、Go で書かれたラムダ関数を使用した単純な定型的なサーバーレス プロジェクトを作成するには何が必要かを理解することにしました。ツールと開発者の...
    プログラミング 2024 年 11 月 6 日に公開
  • Laravelで空の値が一番下にあり空でない値がある行を降順で並べ替える
    Laravelで空の値が一番下にあり空でない値がある行を降順で並べ替える
    データベースを操作する場合、一部のフィールドが空または NULL になる状況がよく発生します。よく発生する課題の 1 つは、空のフィールドを含む行が結果セットの最後に表示され、空ではない値を含む行が意味のある方法 (降順など) で並べられるようにレコードを並べ替える方法です。この投稿では、実用的な例...
    プログラミング 2024 年 11 月 6 日に公開
  • オリーブオイルの利点
    オリーブオイルの利点
    オリーブオイルの利点 地中海食の基礎としてよく称賛されるオリーブオイルは、さまざまな料理に風味を加えるだけでなく、健康上の利点も満載です。オリーブの木の果実から抽出されるオリーブオイルは何世紀にもわたって使用されており、現代の研究によりその多くの利点が明らかになり続けています。オリ...
    プログラミング 2024 年 11 月 6 日に公開
  • JSON Diff: 開発者向けの完全ガイド
    JSON Diff: 開発者向けの完全ガイド
    JSON (JavaScript Object Notation) は、システム間で情報を交換するために広く使用されているデータ形式です。開発者が API、データベース、構成を操作する場合、JSON データの一貫性と正確性を確保することが不可欠です。ここで JSON diff が役に立ちます。 J...
    プログラミング 2024 年 11 月 6 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3