Re: Reduce timing overhead of EXPLAIN ANALYZE using rdtsc?

Lukas Fittl <lukas@fittl.com>

From: Lukas Fittl <lukas@fittl.com>
To: Andres Freund <andres@anarazel.de>
Cc: John Naylor <johncnaylorls@gmail.com>, Jakub Wartak <jakub.wartak@enterprisedb.com>, Hannu Krosing <hannuk@google.com>, Robert Haas <robertmhaas@gmail.com>, Pavel Stehule <pavel.stehule@gmail.com>, vignesh C <vignesh21@gmail.com>, Michael Paquier <michael@paquier.xyz>, Ibrar Ahmed <ibrar.ahmad@gmail.com>, Maciek Sakrejda <m.sakrejda@gmail.com>, pgsql-hackers <pgsql-hackers@postgresql.org>, David Geier <geidav.pg@gmail.com>
Date: 2026-04-08T01:26:04Z
Lists: pgsql-hackers
Hi,

Some minor follow up things worth noting:

(1) I discussed with Andres off-list today if there would be a problem
with TSC instructions being disabled for user mode, since there is
technically a way to restrict them to kernel mode only. In my testing
this won't be a practical problem on Linux, since vDSO already
directly calls RDTSCP, and so if you disallow TSC through
"prctl(PR_SET_TSC, PR_TSC_SIGSEGV)" pg_test_timing does crash - but it
crashes in the clock_gettime call, i.e. would do so even without any
direct TSC use in the picture. Presumably you could change the Linux
clocksource to avoid that. I also did some testing with containers
that use seccomp profiles (e.g. Docker), and there are no issues that
I can found beyond what would have already been a problem before.

If this was a practical problem, we could consider moving the
"pg_initialize_timing_tsc" call in pg_set_timing_clock_source to be
inside the switch cases (like Andres suggested upthread, but did not
change in the commit to be clear), that way a user could start
Postgres with timing_clock_source=system and not have any RDTSC(P)
instructions run at all.

(2) The pg_test_timing documentation has an existing link to this wiki
page: https://wiki.postgresql.org/wiki/Pg_test_timing -- it seems that
page does talk about certain things that are not covered in the main
documentation, but I'm not really sure why that can't be in the main
docs. Do we want to keep maintaining that wiki page? (maybe we should
just remove that link, and move anything we consider critical to the
main docs?)

(3) I will move the patch to add ARM support to a new thread sometime
before the PG20 branch opens, so we can discuss that further.

With that, I've marked the commitfest entry as committed.

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