RFR: JDK-8293472: Potentially incorrect container resource limit detection if manual cgroup fs mounts present [v5]
王超
duke at openjdk.org
Fri Sep 9 05:43:48 UTC 2022
On Thu, 8 Sep 2022 11:57:53 GMT, Severin Gehwolf <sgehwolf at openjdk.org> wrote:
> We definitely need regression tests for memory/cpu limits with those additional cgroup mounts. Please take a look at `test/hotspot/jtreg/containers/docker/TestCPUAwareness.java` and `test/hotspot/jtreg/containers/docker/TestMemoryAwareness.java`
>
> For cgroups v2 the issues isn't fixed. The paths for cg v2 are being set here: https://github.com/openjdk/jdk/blob/98da03af50e2372817a7b5e381eea5ee6f2cb919/src/hotspot/os/linux/cgroupSubsystem_linux.cpp#L303..L313.
>
> Example of running (with your patch on a cg v2 system):
>
> ```
> $ sudo podman run --rm -ti --memory=300M --memory-swap=300M -v /sys/fs/cgroup:/cgroup-in:ro -v $(pwd)/jdk20-jdk:/opt/jdk:z fedora:36 /opt/jdk/bin/java -Xlog:os+container=trace -version 2>&1 | grep 'Memory Limit'
> [0.001s][trace][os,container] Memory Limit is: -2
> [0.055s][trace][os,container] Memory Limit is: -2
> ```
>
> Expected:
>
> ```
> [0.001s][trace][os,container] Memory Limit is: 314572800
> [0.068s][trace][os,container] Memory Limit is: 314572800
> ```
I have add a cgroup v2 test with duplicate mount info, now it's working for cgroup v2.
> test/hotspot/jtreg/containers/docker/DockerBasicTest.java line 91:
>
>> 89: new DockerRunOptions(imageNameAndTag, "/jdk/bin/java", "-version")
>> 90: .addJavaOpts("-Xlog:os+container=trace")
>> 91: .addDockerOpts("-v", "/sys/fs/cgroup:/cgroups-in:ro");
>
> I'd suggest, to first add a test which verifies that without `-Xlog:os+container=trace` option, `java -version` on such a container doesn't print **any** `os+container` logs (it used to print a warning in the` -v /sys/fs/cgroup:/cgroups-in:ro` case). That's all this test should verify.
done
> test/hotspot/jtreg/containers/docker/DockerBasicTest.java line 102:
>
>> 100: .shouldContain("Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us")
>> 101: .shouldContain("Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us")
>> 102: .shouldContain("Path to /memory.limit_in_bytes is /sys/fs/cgroup/memory/memory.limit_in_bytes");
>
> Those are all cgroups v1 specific paths, so the test will fail when run on cgroups v2. I don't think that's necessary. Just remove those and rely on new test cases in `test/hotspot/jtreg/containers/docker/TestCPUAwareness.java` and `test/hotspot/jtreg/containers/docker/TestMemoryAwareness.java`
done
-------------
PR: https://git.openjdk.org/jdk/pull/10193
More information about the hotspot-runtime-dev
mailing list