「cpu = 800およびmemory = 1024でmyApp.jarを実行する」と言います。
私は長年Javaプログラミングを行ってきましたが、この質問をするのは恥ずかしいことです。これが可能かどうかさえわかりません。もしそうなら、どうやって?
私が知りたいのは、Javaプログラムの最大メモリとCPU使用率を設定できるかどうかです。最近モバイルアプリの開発を始めたので、突然これを考えました。どのようにアプリは、メモリとプロセッサが非常に限られているデバイスで動作します。
ブラウザで実行される、またはPCで実行できるデモアプリを備えた物理エンジンを見ました。モバイルデバイスで実行するとどうなりますか?パフォーマンスは同じですか?ライブラリのパフォーマンスをテストするためのサンプルモバイルアプリを開発するのではなく、最初にPCを使用して特定のCPUとメモリで実行したいと思います。
ちなみにグーグルを試してみました...見つけたのはモニタリングとパフォーマンスチューニングだけでした。間違ったキーワードを使用している可能性があります。
-Xmxオプションでメモリ使用量を制限したり、プロセスの優先度やCPUアフィニティを設定してCPU使用率を制限したりできます。
JVMは、CPU使用率や優先度を制御できません。
JVMは、最大/最小メモリ使用量を制御します。
回避策があります。各JVMを個別の[Dockerコンテナ] [1]で実行することができます。また、各コンテナのリソース(メモリ、CPU、ネットワーク、IO)の割り当てを制御します。それはまさにDockerコンテナの付加価値です。
[1]:JVMはCPU使用率や優先度を制御できません。ただし、各JVMを個別のDockerコンテナで実行できます。また、各コンテナのリソース割り当てを制御します。それはまさにDockerコンテナの付加価値です。
Dockerは、Dockerコンテナーを実行するためのCPUアクセスを制限するためのリソース管理オプションを提供します。 Dockerドキュメントの コンテナのリソースを制限する からdocker run
で使用できるCFSスケジューラオプションを確認してください。
--cpus=<value>
-コンテナが使用できるCPUリソースの量を指定します。たとえば、ホストマシンに2つのCPUがあり、--cpus="1.5"
を設定した場合、コンテナは最大で1.5個のCPUが保証されます。これは、--cpu-period="100000"
および--cpu-quota="150000"
を設定するのと同じです。 Docker1.13以降で使用できます。--cpuset-cpus
-コンテナが使用できる特定のCPUまたはコアを制限します。複数のCPUがある場合、コンテナーが使用できるCPUのコンマ区切りリストまたはハイフン区切り範囲。最初のCPUには0の番号が付けられます。有効な値は0-3
(1番目、2番目、3番目、および4番目のCPUを使用する場合)または1,3
(2番目および4番目のCPUを使用する場合)です。
これらのオプションは、Docker swarm/stackをデプロイするときに、 Compose file version 3 reference under resources
で説明されているように、docker-composeを介して使用することもできます。
version: '3' services: redis: image: redis:Alpine deploy: resources: limits: cpus: '0.50' memory: 50M reservations: cpus: '0.25' memory: 20M```
注:docker compose v2の レガシーリソースオプション は、 v3への移行 。
https://github.com/haosdent/jcgroup jcgroupが最良の選択です。このライブラリを使用して、CPU共有、ディスクI/O速度、ネットワーク帯域幅などを制限できます。
このシナリオでは、モバイルエミュレーター(Androidなど)でアプリを実行すると役立つ場合があります。
これにより、特定のCPU /メモリを備えたモバイルデバイスをエミュレートできます。したがって、これはCPUが遅くRAMが少ないデバイスに匹敵するパフォーマンスが得られるはずです。
Android/Nokiaエミュレーターは無料で、Nokia/Googleサイトの開発者セクションからダウンロードできます。
Jvm 8以前を実行するときは、メモリとCPUのオプションに注意してください。それについての非常に素晴らしい記事がいくつかあります。見てみな:
https://developers.redhat.com/blog/2017/03/14/Java-inside-docker/
https://jaxenter.com/nobody-puts-Java-container-139373.html
そうは言っても、コンテナ化は、スタックに関係なくマイクロサービスアーキテクチャを採用する正しい方法であり、jvmもその例外ではありません。ただし、注意事項に注意することが重要です。