Re: Reduce timing overhead of EXPLAIN ANALYZE using rdtsc?

Lukas Fittl <lukas@fittl.com>

From: Lukas Fittl <lukas@fittl.com>
To: Haibo Yan <tristan.yim@gmail.com>
Cc: Andres Freund <andres@anarazel.de>, pgsql-hackers <pgsql-hackers@postgresql.org>, David Geier <geidav.pg@gmail.com>
Date: 2026-04-12T16:38:15Z
Lists: pgsql-hackers

Attachments

Hi Haibo,

On Sat, Apr 11, 2026 at 11:04 PM Haibo Yan <tristan.yim@gmail.com> wrote:
>
> Thanks for the patch. I may be missing something, but I wonder if the new debug path can still end up calling pg_tsc_calibrate_frequency() after tsc_detect_frequency() already bailed out with no rdtscp or not invariant.
> If so, it seems the diagnostics path is no longer following the same gate as the normal TSC-usability path, and could still execute pg_rdtscp() while only trying to print debug info.
> Maybe I am overlooking a guard somewhere, but I think it would be safer either to use the same prerequisites here, or keep this helper purely passive.

Yes, that's a good point. I don't think the TSC not being invariant
would be a problem on its own, but the RDTSCP instruction not being
available would presumably make the frequency function fail.

I think the easiest way to approach that is to only run the
calibration function in the debug path when we have a frequency, but
it wasn't determined through calibration. Per earlier note from Andres
running calibration in those cases is intentional to help us compare
CPUID data with what we got from calibration.

Attached v28, which also adds the exit(1) mentioned earlier.

FWIW, for archive's sake, drongo is green again now, thanks to commit
7fc36c5db550 (Avoid CPUID 0x15/0x16 for Hypervisor TSC frequency).

Thanks,
Lukas

--
Lukas Fittl

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. pg_test_timing: Show additional TSC clock source debug info

  2. instrumentation: Avoid CPUID 0x15/0x16 for Hypervisor TSC frequency

  3. pg_test_timing: Also test RDTSC[P] timing, report time source, TSC frequency

  4. Allow retrieving x86 TSC frequency/flags from CPUID

  5. instrumentation: Standardize ticks to nanosecond conversion method

  6. instrumentation: Use Time-Stamp Counter on x86-64 to lower overhead

  7. Check for __cpuidex and __get_cpuid_count separately

  8. pg_test_timing: Reduce per-loop overhead

  9. Refactor handling of x86 CPUID instructions

  10. instrumentation: Drop INSTR_TIME_SET_CURRENT_LAZY macro

  11. Rename pg_crc32c_sse42_choose.c for general purpose

  12. Zero initialize uses of instr_time about to trigger compiler warnings

  13. instr_time: Represent time as an int64 on all platforms

  14. Add 250c8ee07ed to git-blame-ignore-revs