簡體   English   中英

限制 java 應用程序的 memory 和 cpu 使用

[英]Limiting java application's memory and cpu usage

說,“使用 cpu=800 和內存=1024 運行 myApp.jar”

我從事 java 編程多年,問這個問題很尷尬。 我什至不知道這是否可能。 如果是這樣,怎么辦?

我只想知道是否可以設置 java 程序的最大 memory 和 cpu 使用率。 我突然想到這個是因為我最近開始開發移動應用程序。 我想知道該應用程序在 memory 和處理器非常有限的設備上的行為方式。

我看到了帶有演示應用程序的物理引擎,這些應用程序可以在瀏覽器上運行,也可以在我的 PC 上執行。 如果我在移動設備上運行它們會怎樣? 性能會一樣嗎? 與其開發示例移動應用程序來測試庫的性能,不如先使用我的 PC 使用特定的 cpu 和 memory 運行它。

順便說一句,我試着用谷歌搜索……我發現的只是監控和性能調整。 我可能使用了錯誤的關鍵字。

您可以通過 -Xmx 選項限制內存使用,並且可以通過設置進程的優先級和/或 CPU 關聯來限制 CPU 使用。

JVM 無法控制 CPU 使用率或優先級。

JVM 可以控制最大/最小內存使用量。

有一個解決方法。 可以在單獨的 [Docker 容器][1] 中運行每個 JVM。 並控制每個容器的資源(Memory、CPU、Network、IO)分配。 這正是 Docker 容器的附加價值。

[1]:JVM 無法控制 CPU 使用率和優先級。 但是,您可以在單獨的 Docker 容器中運行每個 JVM。 並控制每個容器的資源分配。 這正是 Docker 容器的附加價值。

Docker 提供了資源管理選項來限制運行 Docker 容器的 CPU 訪問。 從 Docker 文檔中的限制容器資源中查看docker run可用的 CFS 調度程序選項,例如:

  • --cpus=<value> - 指定容器可以使用的可用 CPU 資源量。 例如,如果主機有兩個 CPU 並且您設置了--cpus="1.5" ,則容器最多保證一個半 CPU。 這相當於設置--cpu-period="100000"--cpu-quota="150000" 在 Docker 1.13 及更高版本中可用。
  • --cpuset-cpus - 限制容器可以使用的特定 CPU 或內核。 如果您有多個 CPU,則容器可以使用的以逗號分隔的列表或以連字符分隔的 CPU 范圍。 第一個 CPU 編號為 0。有效值可能是0-3 (使用第一個、第二個、第三個和第四個 CPU)或1,3 (使用第二個和第四個 CPU)。

這些選項也可通過 docker-compose 在部署 Docker swarm/stack 時使用,如resources下的Compose 文件版本 3 參考中所述

 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 的堆棧。

運行 jvm 8 或更早版本時,請注意內存和 CPU 選項。 有幾篇關於這方面的非常好的文章。 檢查一下:

https://developers.redhat.com/blog/2017/03/14/java-inside-docker/

https://jaxenter.com/nobody-puts-java-container-139373.html

話雖如此,容器化 - 無論堆棧如何,都是采用微服務架構的正確方法,而 jvm 也不例外。 但是,重要的是要注意注意事項。

Linux:

taskset -a -c 0,1,2,3 <program>

僅在內核 0、1、2 和 3 上運行程序及其子線程。

https://github.com/haosdent/jcgroup jcgroup 是你最好的選擇。 你可以使用這個庫來限制 CPU 份額、磁盤 I/O 速度、網絡帶寬等。

對於 CPU,您可以嘗試我的新庫 :)。

https://github.com/dyorgio/cpu-watcher

使用示例:

// Limit process by PID to 25% of host cpu usage
CpuWatcher cpuWatcher = new CpuWatcher(pid, 25f);
cpuWatcher.start();

在這種情況下,在移動模擬器(例如 Android)上運行應用程序可能會有所幫助。

有了它,您可以模擬具有特定 CPU/內存的移動設備。 因此,您應該獲得與 CPU 速度較慢和 RAM 較小的設備相當的性能。

Android/諾基亞模擬器是免費的,可從諾基亞/谷歌網站的開發者部分下載。

對於資源受限的系統,我曾經發現以下 java 命令行選項對我的特定用例很有幫助(使用 OpenJDK 17 測試)。 它限制堆 memory(初始值: -Xms ,最大值: -Xmx ),絕對最大 RAM 並且還設置為僅使用串行垃圾收集器以減少自發的 CPU 負載突發:

java -Xmx512m -Xms128m -XX:MaxRAM=1536m -XX:+UseSerialGC

當然,您必須查明您的應用程序是否仍然可以使用這些設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM