RFR: 8321931: memory_swap_current_in_bytes reports 0 as "unlimited"

Severin Gehwolf sgehwolf at openjdk.org
Wed Jan 17 13:17:51 UTC 2024


On Mon, 8 Jan 2024 21:28:46 GMT, Gerard Ziemski <gziemski at openjdk.org> wrote:

> We make a distinction between 0 for a limit vs non-limit cgroup values.
> 
> For a limit-type value, 0 means `unlimited`. For all the others 0 means simply 0.
> 
> Output before from `jcmd PID VM.info`:
> 
> 
> container (cgroup) information:
> container_type: cgroupv2
> cpu_cpuset_cpus: not supported
> cpu_memory_nodes: not supported
> active_processor_count: 8
> cpu_quota: not supported
> cpu_period: not supported
> cpu_shares: not supported
> memory_limit_in_bytes: unlimited
> memory_and_swap_limit_in_bytes: unlimited
> memory_soft_limit_in_bytes: unlimited
> memory_usage_in_bytes: 11129120 k
> memory_max_usage_in_bytes: not supported
> memory_swap_current_in_bytes: unlimited
> memory_swap_max_limit_in_bytes: unlimited
> maximum number of tasks: 18963
> current number of tasks: 33
> 
> 
> Output now from `jcmd PID VM.info`:
> 
> 
> container (cgroup) information:
> container_type: cgroupv2
> cpu_cpuset_cpus: not supported
> cpu_memory_nodes: not supported
> active_processor_count: 8
> cpu_quota: not supported
> cpu_period: not supported
> cpu_shares: not supported
> memory_limit_in_bytes: unlimited
> memory_and_swap_limit_in_bytes: unlimited
> memory_soft_limit_in_bytes: unlimited
> memory_usage_in_bytes: 4962584 k
> memory_max_usage_in_bytes: not supported
> memory_swap_current_in_bytes: 0
> memory_swap_max_limit_in_bytes: unlimited
> maximum number of tasks: 18963
> current number of tasks: 33
> 
> In this example `memory_swap_current_in_bytes` should be printed as equal to 0, not "unlimited".

The bug is a bit thin on the details. Can that be improved? I'm not aware that any of the APIs in hotspot return 0 for `unlimited`. If it is, it's a bug. It would be good to have this captured in a test somewhere. Would a test with `--memory 200M --memory-swap=200M` (no swap), trigger the said case? I think it would. For cg v1 the test case would probably also need a swappiness value of `0`.

src/hotspot/os/linux/osContainer_linux.cpp line 142:

> 140: void OSContainer::print_container_helper(outputStream* st, jlong j, const char* metrics) {
> 141:   st->print("%s: ", metrics);
> 142:   if (j > 0) {

I agree with @iklam. The fix for this seems to be to change the condition here to `j >= 0`.

-------------

Changes requested by sgehwolf (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/17314#pullrequestreview-1827250525
PR Review Comment: https://git.openjdk.org/jdk/pull/17314#discussion_r1455509352


More information about the hotspot-runtime-dev mailing list