Re: Reduce timing overhead of EXPLAIN ANALYZE using rdtsc?

Andres Freund <andres@anarazel.de>

From: Andres Freund <andres@anarazel.de>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Lukas Fittl <lukas@fittl.com>, Haibo Yan <tristan.yim@gmail.com>, pgsql-hackers <pgsql-hackers@postgresql.org>, David Geier <geidav.pg@gmail.com>
Date: 2026-04-12T18:30:39Z
Lists: pgsql-hackers
Hi,

On 2026-04-12 14:20:31 -0400, Tom Lane wrote:
> Lukas Fittl <lukas@fittl.com> writes:
> > FWIW, for archive's sake, drongo is green again now, thanks to commit
> > 7fc36c5db550 (Avoid CPUID 0x15/0x16 for Hypervisor TSC frequency).
>
> drongo may be happy, but Coverity is not:
>
> 166     	uint64		loop_count;
> 167
> 168     	loop_count = test_timing(test_duration, TIMING_CLOCK_SOURCE_SYSTEM, false);
> >>>     CID 1691465:         Incorrect expression  (DIVIDE_BY_ZERO)
> >>>     In function call "output", division by expression "loop_count" which may be zero has undefined behavior.
> 169     	output(loop_count);
>
> AFAICS it's correct to complain.  test_timing() visibly can return zero,
> but of the three places where test_timing() is followed by output()
> only one has a defense against that.

I think it should be unreachable as-is (but we should fix it anyway): If the
system clock source doesn't work, we have much bigger issues. If rdtscp works,
rdtsc should better work as well...

Maybe it's enough to add an Assert() to clarify this?  But I guess just
printing a message in that unreachable case would also work.

Greetings,

Andres Freund



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