<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div dir="ltr" style="font-family: Aptos, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Hi Jaromir,</div>
<div dir="ltr" style="font-family: Aptos, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div dir="ltr" style="font-family: Aptos, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
That sounds interesting :), as long as we are confident that your observation is part of the user ABI. Feel free to submit a PR and I will happily review it. Also add a link or reasoning to confirm that it is part of the user ABI.</div>
<div dir="ltr" style="font-family: Aptos, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div dir="ltr" style="font-family: Aptos, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Thank you,</div>
<div dir="ltr" style="font-family: Aptos, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Jonas</div>
<div dir="ltr" style="font-family: Aptos, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div id="mail-editor-reference-message-container">
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing"></div>
<div class="ms-outlook-mobile-reference-message skipProofing" style="text-align: left; padding: 3pt 0in 0in; border-width: 1pt medium medium; border-style: solid none none; border-color: rgb(181, 196, 223) currentcolor currentcolor; font-family: Aptos; font-size: 12pt; color: black;">
<b>From: </b>hotspot-runtime-dev <hotspot-runtime-dev-retn@openjdk.org> on behalf of Jaromir Hamala <jaromir.hamala@gmail.com><br>
<b>Date: </b>Tuesday, 23 December 2025 at 14:36<br>
<b>To: </b>Kevin Walls <kevinw@openjdk.org><br>
<b>Cc: </b>hotspot-runtime-dev@openjdk.org <hotspot-runtime-dev@openjdk.org><br>
<b>Subject: </b>Re: RFR: 8372584: [Linux]: Replace reading proc to get thread user CPU time with clock_gettime [v7]<br>
<br>
</div>
<div dir="ltr" class="gmail_attr">On Wed, Dec 3, 2025 at 10:35 AM Kevin Walls <<a href="mailto:kevinw@openjdk.org" data-outlook-id="4db8ad15-d1b2-4b1e-8ffe-f0c4651dadd6">kevinw@openjdk.org</a>> wrote:</div>
<blockquote style="margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204);">
<div dir="ltr" class="gmail_quote">On Tue, 2 Dec 2025 20:59:41 GMT, Jonas Norlinder <<a href="mailto:jnorlinder@openjdk.org" target="_blank" data-outlook-id="5c24a8a2-13e2-442a-af60-73fdf06f8f6f">jnorlinder@openjdk.org</a>> wrote:<br>
<br>
>> 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.<br>
>><br>
>> This PR also results in improved performance and thus a reduced observer effect, especially for the 100th percentile (max).<br>
>><br>
>> Before patch:<br>
>><br>
>> Benchmark                  Mode      Cnt  Score    Error  Units<br>
>> CPUTime.execute          sample  7506555  0.008 ±  0.001  ms/op<br>
>> CPUTime.execute:p0.00    sample           0.008           ms/op<br>
>> CPUTime.execute:p0.50    sample           0.008           ms/op<br>
>> CPUTime.execute:p0.90    sample           0.008           ms/op<br>
>> CPUTime.execute:p0.95    sample           0.008           ms/op<br>
>> CPUTime.execute:p0.99    sample           0.012           ms/op<br>
>> CPUTime.execute:p0.999   sample           0.015           ms/op<br>
>> CPUTime.execute:p0.9999  sample           0.021           ms/op<br>
>> CPUTime.execute:p1.00    sample           1.030           ms/op<br>
>><br>
>><br>
>> After patch:<br>
>><br>
>> Benchmark                  Mode      Cnt   Score    Error  Units<br>
>> CPUTime.execute          sample  8984189  ≈ 10⁻³           ms/op<br>
>> CPUTime.execute:p0.00    sample           ≈ 10⁻³           ms/op<br>
>> CPUTime.execute:p0.50    sample           ≈ 10⁻³           ms/op<br>
>> CPUTime.execute:p0.90    sample           ≈ 10⁻³           ms/op<br>
>> CPUTime.execute:p0.95    sample           ≈ 10⁻³           ms/op<br>
>> CPUTime.execute:p0.99    sample            0.001           ms/op<br>
>> CPUTime.execute:p0.999   sample            0.001           ms/op<br>
>> CPUTime.execute:p0.9999  sample            0.006           ms/op<br>
>> CPUTime.execute:p1.00    sample            0.054           ms/op<br>
>><br>
>><br>
>> Testing: `java/lang/management/ThreadMXBean/ThreadUserTime.java` and the added microbenchmark.<br>
><br>
> Jonas Norlinder has updated the pull request incrementally with one additional commit since the last revision:<br>
><br>
>   Align signature to standard<br>
<br>
Looks good - I remember that fix for parsing the program binary name containing brackets, good to have it gone.<br>
<br>
-------------<br>
<br>
Marked as reviewed by kevinw (Reviewer).<br>
<br>
PR Review: <a href="https://git.openjdk.org/jdk/pull/28556#pullrequestreview-3534064399" target="_blank" rel="noreferrer" data-outlook-id="4b515724-a903-4c15-a5ae-336f2a6b97c3">
https://git.openjdk.org/jdk/pull/28556#pullrequestreview-3534064399</a></div>
</blockquote>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing"><br>
</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">Apologies for reviving an old treat. I was experimenting with this change, and I believe there is a further optimisation opportunity: When clockid has TID set to 0, then the kernel treats
 it as 'the current task' (=which is what getCurrentThreadUserTime() requires) and avoids a radix lookup required for an arbitrary TID.</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing"><br>
</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">The change:
<a href="https://github.com/jerrinot/jdk/compare/master...jerrinot:jdk:jh_faster_getCurrentThreadUserTime" data-outlook-id="511df8ef-760a-49d7-9468-cfc72930f97b">
https://github.com/jerrinot/jdk/compare/master...jerrinot:jdk:jh_faster_getCurrentThreadUserTime</a></div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">The benchmark from
<a href="https://github.com/openjdk/jdk/pull/28556" data-outlook-id="7318077b-c6fa-4493-9ba6-e69483208b9b">
https://github.com/openjdk/jdk/pull/28556</a> (switched to nanos + more iterations + fork count):</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing"><br>
</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">Before:</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">Benchmark                                             Mode      Cnt       Score   Error  Units<br>
ThreadMXBeanBench.getCurrentThreadUserTime          sample  4347067      81.746 ± 0.510  ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.00    sample               69.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.50    sample               80.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.90    sample               90.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.95    sample               90.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.99    sample               90.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.999   sample              230.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.9999  sample             1980.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p1.00    sample           653312.000          ns/op<br>
<br>
After:<br>
Benchmark                                             Mode      Cnt       Score   Error  Units<br>
ThreadMXBeanBench.getCurrentThreadUserTime          sample  5081223      70.813 ± 0.325  ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.00    sample               59.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.50    sample               70.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.90    sample               70.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.95    sample               70.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.99    sample               80.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.999   sample              170.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p0.9999  sample             1830.000          ns/op<br>
ThreadMXBeanBench.getCurrentThreadUserTime:p1.00    sample           425472.000          ns/op</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing"><br>
</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">There is around 13% latency improvement on average.</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">It increases coupling to kernel internals a bit further, but the original patch already does that by poking the lower bits + Linux has a strong policy on ABI stability.</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing"><br>
</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">Would you be interested in merging a similar patch?</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing"><br>
</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">Cheers,</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">Jaromir Hamala</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing"><br>
</div>
<div dir="ltr" class="ms-outlook-mobile-reference-message skipProofing">--</div>
<div dir="ltr" class="gmail_signature">“Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.”<br>
Antoine de Saint Exupéry</div>
</div>
</body>
</html>