BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Java 9はDockerで実行する際のメモリ制限を調整する

Java 9はDockerで実行する際のメモリ制限を調整する

ブックマーク

原文(投稿日:2017/02/21)へのリンク

最初の実験的変更がOpenJDK 9に追加された。JVMがコンテナ内で実行していることを理解しメモリ制限を適切に調整できるようにするためだ。ここ数年でコンテナの人気が高まっているにも関わらず、JVMを含む多くのツールは利用できるリソースの判断にまだホストパラメータを頼っている。それでしばしばout of memoryとなり、エラーメッセージに悩まされる。この変更はJava 9が一般リリースされれば利用できるはずだ。こういったシナリオの多くを防ぐよう努める。

DockerHerokuKubernetesのようなコンテナ技術はLinuxのオペレーションシステムをベースにしたとくに軽量な仮想マシンの一形態である。フットプリントを減らすことでより早くそしてより少ないリソース消費にする、とても類似した機能を提供できることを意味する。しかし不便な点もついてくる。本格的な仮想マシンが専用ハードウェアのスタック全体をシミュレートし、これが既存のソフトウェアがたいていは期待通りに動作することを意味する一方、コンテナ技術はホストのハードウェアとOSを使い、これはホストの情報を当てにするソフトウェアがコンテナが課するさらなる制約に気づかず動作するかもしれないことを意味する。Fabio Kung氏は、ネットフリックスのLinuxコンテナサービスの開発者だが(Titusとしてまた知られている)、氏は2014年にこれらの影響を説明するよい記事を書いた。この記事のいくつかの内容は現在では古くなっているが、まだこのトピックへのよい導入として役立つ。

JVMはこれに不慣れではない。もし最大メモリ制限が-Xmxで指定されていれば、JVMは物理メモリの一部分としてそれを設定する(一般的に4分の1だが、変わるかもしれない)。これはコンテナによって課せられた制限を考慮しないかもしれない。提案された変更はこの問題をJVMがLinux技術のコントロールグループまたはcgroup内で動作しているかチェックすることによって防ぐことを目標にしている。ほとんどのコンテナ技術は以前ハードウェアと他のリソースの使用において制限を強制していた。もしJVMがcgroup内で動作していることを検出すると、定義されたメモリ制限を見つけ、そのような制限を利用可能な物理メモリとして考慮しようとする。他すべてのパラメータをこの機能として設定する。これはまだ実験的で、それゆえに-XX:+UseCGroupMemoryLimitForHeapオプションを有効にしたときのみ適用される。

cgroupsは2008年にLinuxカーネルに組み入れられ2013年に再設計された。これはリソースの使用を分離しアプリケーションがとくにメモリとCPU、IO、ネットワークへのアクセスを制御できるようにする。異なるアプリケーションはそれぞれのコントロールグループ階層をグループごとに異なる制限で作成できる。アプリケーションは実行グループを事前に知らないこととなる。これがJVMが適切にcgroupsと潜在的なメモリ制限に関する見当をつけることだけができる理由である。

Rate this Article

Relevance
Style

この記事に星をつける

おすすめ度
スタイル

BT