RFR: 8268228: TSC is not used for CPUTimeStampCounter on AMD processor
David Holmes
dholmes at openjdk.java.net
Fri Jun 4 05:11:54 UTC 2021
On Fri, 4 Jun 2021 01:56:50 GMT, Yasumasa Suenaga <ysuenaga at openjdk.org> wrote:
> I ran JVM on Ryzen 3300X, and I got following `jdk.CPUTimeStampCounter` event.
>
>
> jdk.CPUTimeStampCounter {
> startTime = 10:41:14.993
> fastTimeEnabled = false
> fastTimeAutoEnabled = true
> osFrequency = 1000000000
> fastTimeFrequency = 1000000000
> }
>
>
> I confirmed 3300X supports Invariant TSC (so `fastTimeAutoEnabled` is set to `true`), however it does not seem to be used (`fastTimeEnabled` is `false`).
>
> Frequency is come from brand string from CPUID (e.g. "Intel(R) Core(TM) i3-8145U CPU @ 2.10GHz"). However AMD processor (Ryzen at least) does not have it ("AMD Ryzen 3 3300X 4-Core Processor").
> Fortunately rdtsc_x86.cpp can calculate the frequency like bogomips. We should fallback to it if we cannot get the frequency even if invariant TSC is supported.
>
> After this change, I got following `jdk.CPUTimeStampCounter` event. Base clock of Ryzen 3 3300X is 3.8GHz, so `fastTimeFrequency` looks good.
>
>
> jdk.CPUTimeStampCounter {
> startTime = 10:33:52.884
> fastTimeEnabled = true
> fastTimeAutoEnabled = true
> osFrequency = 10000000 Hz
> fastTimeFrequency = 3792929124 Hz
> }
>
>
> This problem is not only for JFR. I confirmed `Rdtsc` class is used in ticks.cpp , and it relates to GC code at least.
Hi Yasumasa,
This seems reasonable to address the observed problem, though I have to wonder why a system with invariant TSC is not properly reporting a maximum frequency? Makes me wonder how many chips may actually be impacted here?
Thanks,
David
src/hotspot/cpu/x86/rdtsc_x86.cpp line 109:
> 107: os_to_tsc_conv_factor = tsc_freq / os_freq;
> 108: }
> 109: if (tsc_freq == 0.0f) {
tsc_freq is a double so use 0.0 not 0.0f
Probably worth a comment explaining this - something like:
// If no invariant TSC, or the system failed to report a useful maximum frequency, use an estimation.
-------------
PR: https://git.openjdk.java.net/jdk/pull/4350
More information about the hotspot-dev
mailing list