RFR: 8170888: [linux] Experimental support for cgroup memory limits in container (ie Docker) environments
David Holmes
david.holmes at oracle.com
Fri Dec 9 02:59:20 UTC 2016
Bug: https://bugs.openjdk.java.net/browse/JDK-8170888
webrev: http://cr.openjdk.java.net/~dholmes/8170888/webrev/
Adapted from the original submission here:
http://mail.openjdk.java.net/pipermail/hotspot-dev/2016-November/025404.html
and continuing:
http://mail.openjdk.java.net/pipermail/hotspot-dev/2016-December/025406.html
Christine: who should get original contribution credit - you or Andrew
or both?
The change adds an experimental flag, -XX:+UseCGroupMemoryLimitForHeap,
to opt-in to using the cgroup memory limit value as the value to use for
"physical memory" when doing heap sizing. This is determined solely by
the presence of, and then content of, the file
/sys/fs/cgroup/memory/memory.limit_in_bytes. More extensive support will
be investigated for JDK 10.
As the flag is opt-in, and we don't expect people to use it unless they
expect there to be active cgroups, we warn if the file can not be found,
or the memory limit value can not be parsed.
I considered making the flag linux-only and ifdef'ing the logic, but
thought it might be useful to be able to pretend that a memory limit
exists on other platforms just by creating this marker file (even though
you'd need the right perms to create it).
Testing: manual - see below for output
Thanks,
David
-----
Here's an example run in a container with memory limited to 256M. First
without using the flag:
root at 2f2664c92737:/# ./jdk-9/fastdebug/bin/java -XX:+PrintFlagsFinal
-version | grep MaxHeap
uintx MaxHeapFreeRatio = 70 {manageable} {default}
size_t MaxHeapSize = 16873684992 {product} {ergonomic}
java version "9-internal"
Java(TM) SE Runtime Environment (fastdebug build
9-internal+0-2016-12-07-202859.daholme.jdk9-hs-dev2)
Java HotSpot(TM) 64-Bit Server VM (fastdebug build
9-internal+0-2016-12-07-202859.daholme.jdk9-hs-dev2, mixed mode)
And then with:
root at 2f2664c92737:/# ./jdk-9/fastdebug/bin/java -XX:+PrintFlagsFinal
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
-version | grep MaxHeap
uintx MaxHeapFreeRatio = 70 {manageable} {default}
size_t MaxHeapSize = 132120576 {product} {ergonomic}
java version "9-internal"
Java(TM) SE Runtime Environment (fastdebug build
9-internal+0-2016-12-07-202859.daholme.jdk9-hs-dev2)
Java HotSpot(TM) 64-Bit Server VM (fastdebug build
9-internal+0-2016-12-07-202859.daholme.jdk9-hs-dev2, mixed mode)
so we can see the affect on the heap size.
Example of logging output:
root at e3f0f811cd91:/# ./jdk-9/fastdebug/bin/java
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
-Xlog:gc+heap -version
[0.003s][info][gc,heap] Setting phys_mem to the min of cgroup limit
(128MB) and initial phys_mem (64353MB)
[0.016s][info][gc,heap] Heap region size: 1M
java version "9-internal"
Java(TM) SE Runtime Environment (fastdebug build
9-internal+0-2016-12-07-202859.daholme.jdk9-hs-dev2)
Java HotSpot(TM) 64-Bit Server VM (fastdebug build
9-internal+0-2016-12-07-202859.daholme.jdk9-hs-dev2, mixed mode)
Example of enabling the flag on a system with no cgroups:
> ./build/linux-x64-debug/images/jdk/bin/java
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -version
Java HotSpot(TM) 64-Bit Server VM warning: Unable to open cgroup memory
limit file /sys/fs/cgroup/memory/memory.limit_in_bytes (No such file or
directory)
java version "9-internal"
Java(TM) SE Runtime Environment (fastdebug build
9-internal+0-2016-12-07-202859.daholme.jdk9-hs-dev2)
Java HotSpot(TM) 64-Bit Server VM (fastdebug build
9-internal+0-2016-12-07-202859.daholme.jdk9-hs-dev2, mixed mode)
Example logging output when running unlimited:
./jdk-9/fastdebug/bin/java -XX:+UnlockExperimentalVMOptions
-XX:+UseCGroupMemoryLimitForHeap -Xlog:gc+heap -version
[0.002s][info][gc,heap] Setting phys_mem to the min of cgroup limit
(8796093022207MB) and initial phys_mem (64353MB)
[0.016s][info][gc,heap] Heap region size: 4M
java version "9-internal"
Java(TM) SE Runtime Environment (fastdebug build
9-internal+0-2016-12-07-202859.daholme.jdk9-hs-dev2)
Java HotSpot(TM) 64-Bit Server VM (fastdebug build
9-internal+0-2016-12-07-202859.daholme.jdk9-hs-dev2, mixed mode)
More information about the hotspot-dev
mailing list