On Fri, 7 Nov 2025 15:28:01 GMT, Severin Gehwolf <[email protected]> wrote:

>> Please review this change to the Linux container detection code updating the 
>> mapping function of cg v2 to most recent runtimes' implementation. OCI has 
>> been standardized with cgroup v1 in mind and there is a mapping function in 
>> place - implemented by container runtimes such as `runc` or `crun` - which 
>> map the passed `--cpu-shares` value on the engine's `run` command to the 
>> internal cgroup v2 `cpu.weight` interface file's values.
>> 
>> For runtimes lower than 1.23 (crun) and 1.3.2 (runc) the mapping function 
>> was (where `y=<cpu.weight value>` and `x=<cpu-shares CLI value>`):
>> 
>> 
>> f(x) = {(x - 2) \times 9999 + 1 \over 262142}
>> 
>> 
>> This changed in `crun` >= 1.23 and `runc` >= 1.3.2 to:
>> 
>> 
>> f(x)=10^{({{\log_{2}(x)}^2 \over 612} + {125 \over 612} \times \log_{2}(x) - 
>> {7 \over 34})}
>> 
>> 
>> Therefore, we need to find the inverse of the new quadratic mapping function 
>> and use that over the inverse of the old mapping function. Since the input 
>> domain is `[2,262144]` for `--cpu-shares` mapping to `[1,10000]` for 
>> `cpu.weight` we can discount the negative exponent value as a possible 
>> solution.
>> 
>> Since there are production systems out there with those runtimes already I 
>> believe it's time to change the mapping function internal to the JDK to the 
>> new one in JDK 26. There is a chance that JDK 26 would run on old runtimes 
>> in a container using cgroup v2, resulting in wrong diagnostics. The chance 
>> of this happening will decrease over time.
>> 
>> Thoughts?
>> 
>> **Testing:**
>> - [x] GHA
>> - [x] `test/hotspot/jtreg/containers` and `test/jdk/jdk/internal/platform` 
>> on cgroup v1 (with an old runtime - code not affected) and on cgroup v2 with 
>> a new runtime. All tests passed.
>
> Severin Gehwolf has updated the pull request with a new target base due to a 
> merge or a rebase. The incremental webrev excludes the unrelated changes 
> brought in by the merge/rebase. The pull request contains five additional 
> commits since the last revision:
> 
>  - Merge branch 'master' into jdk-8370492-fix-cpushares-mapping
>  - Fix include
>  - Add asserts/checks for input domain
>  - Add regression test for jdk-8370492
>  - 8370492: [Linux] Update cpu shares to cpu.weight mapping function

Before apply the propose patch, test 
jdk/internal/platform/docker/TestDockerCpuMetrics.java run failed. After apply 
the propose patch, test jdk/internal/platform/docker/TestDockerCpuMetrics.java 
run passed.

test/jdk/jdk/internal/platform/docker/MetricsCpuTester.java line 151:

> 149:             // have a 1-to-1 mapping from the cgroup v2 value to the OCI
> 150:             // value.
> 151:             System.out.println("Debug: cgv2 - Got CPU shares of: " +

I found you 'import jtreg.SkippedException;' on file 
test/hotspot/jtreg/containers/docker/TestMisc.java. Do you want to 'throw new 
SkippedException' rather that just print 'Skipping assert'

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

PR Review: https://git.openjdk.org/jdk/pull/28157#pullrequestreview-3441113583
PR Review Comment: https://git.openjdk.org/jdk/pull/28157#discussion_r2508932192

Reply via email to