RFR: 8372584: [Linux]: Replace reading proc to get thread user CPU time with clock_gettime [v6]

Jonas Norlinder jnorlinder at openjdk.org
Tue Dec 2 13:10:35 UTC 2025


> Since kernel v2.6.12 the Linux ABI have had support for encoding the clock types in the last three bits. Setting bit to 001 (CPUCLOCK_VIRT) will result in the kernel returning only user time. POSIX compliant implementations of pthread_getcpuclockid for the Linux kernel defaults to construct a clockid that with 010 (CPUCLOCK_SCHED) set, which return system+user time, which is what the POSIX standard mandates, see POSIX.1-2024/IEEE Std 1003.1-2024 §3.90. This patch joins the family of glibc, musl etc.  that utilities this bit pattern.
> 
> This PR also results in improved performance and thus a reduced observer effect, especially for the 100th percentile (max).
> 
> Before patch:
> 
> Benchmark                  Mode      Cnt  Score    Error  Units
> CPUTime.execute          sample  7506555  0.008 ±  0.001  ms/op
> CPUTime.execute:p0.00    sample           0.008           ms/op
> CPUTime.execute:p0.50    sample           0.008           ms/op
> CPUTime.execute:p0.90    sample           0.008           ms/op
> CPUTime.execute:p0.95    sample           0.008           ms/op
> CPUTime.execute:p0.99    sample           0.012           ms/op
> CPUTime.execute:p0.999   sample           0.015           ms/op
> CPUTime.execute:p0.9999  sample           0.021           ms/op
> CPUTime.execute:p1.00    sample           1.030           ms/op
> 
> 
> After patch:
> 
> Benchmark                  Mode      Cnt   Score    Error  Units
> CPUTime.execute          sample  8984189  ≈ 10⁻³           ms/op
> CPUTime.execute:p0.00    sample           ≈ 10⁻³           ms/op
> CPUTime.execute:p0.50    sample           ≈ 10⁻³           ms/op
> CPUTime.execute:p0.90    sample           ≈ 10⁻³           ms/op
> CPUTime.execute:p0.95    sample           ≈ 10⁻³           ms/op
> CPUTime.execute:p0.99    sample            0.001           ms/op
> CPUTime.execute:p0.999   sample            0.001           ms/op
> CPUTime.execute:p0.9999  sample            0.006           ms/op
> CPUTime.execute:p1.00    sample            0.054           ms/op
> 
> 
> Testing: `java/lang/management/ThreadMXBean/ThreadUserTime.java` and the added microbenchmark.

Jonas Norlinder has updated the pull request incrementally with one additional commit since the last revision:

  Add fixes for @dholmes-ora review

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/28556/files
  - new: https://git.openjdk.org/jdk/pull/28556/files/345ba380..902b7787

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=28556&range=05
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=28556&range=04-05

  Stats: 10 lines in 1 file changed: 4 ins; 0 del; 6 mod
  Patch: https://git.openjdk.org/jdk/pull/28556.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/28556/head:pull/28556

PR: https://git.openjdk.org/jdk/pull/28556


More information about the hotspot-runtime-dev mailing list