1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>pg_test_timing</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" /><link rel="prev" href="pgtestfsync.html" title="pg_test_fsync" /><link rel="next" href="pgupgrade.html" title="pg_upgrade" /></head><body id="docContent" class="container-fluid col-10"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center"><span class="application">pg_test_timing</span></th></tr><tr><td width="10%" align="left"><a accesskey="p" href="pgtestfsync.html" title="pg_test_fsync">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="reference-server.html" title="PostgreSQL Server Applications">Up</a></td><th width="60%" align="center">PostgreSQL Server Applications</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 18.0 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="pgupgrade.html" title="pg_upgrade">Next</a></td></tr></table><hr /></div><div class="refentry" id="PGTESTTIMING"><div class="titlepage"></div><a id="id-1.9.5.12.1" class="indexterm"></a><div class="refnamediv"><h2><span class="refentrytitle"><span class="application">pg_test_timing</span></span></h2><p>pg_test_timing — measure timing overhead</p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><div class="cmdsynopsis"><p id="id-1.9.5.12.4.1"><code class="command">pg_test_timing</code> [<em class="replaceable"><code>option</code></em>...]</p></div></div><div class="refsect1" id="id-1.9.5.12.5"><h2>Description</h2><p>
3 <span class="application">pg_test_timing</span> is a tool to measure the timing overhead
4 on your system and confirm that the system time never moves backwards.
5 Systems that are slow to collect timing data can give less accurate
6 <code class="command">EXPLAIN ANALYZE</code> results.
7 </p></div><div class="refsect1" id="id-1.9.5.12.6"><h2>Options</h2><p>
8 <span class="application">pg_test_timing</span> accepts the following
11 </p><div class="variablelist"><dl class="variablelist"><dt><span class="term"><code class="option">-d <em class="replaceable"><code>duration</code></em></code><br /></span><span class="term"><code class="option">--duration=<em class="replaceable"><code>duration</code></em></code></span></dt><dd><p>
12 Specifies the test duration, in seconds. Longer durations
13 give slightly better accuracy, and are more likely to discover
14 problems with the system clock moving backwards. The default
15 test duration is 3 seconds.
16 </p></dd><dt><span class="term"><code class="option">-V</code><br /></span><span class="term"><code class="option">--version</code></span></dt><dd><p>
17 Print the <span class="application">pg_test_timing</span> version and exit.
18 </p></dd><dt><span class="term"><code class="option">-?</code><br /></span><span class="term"><code class="option">--help</code></span></dt><dd><p>
19 Show help about <span class="application">pg_test_timing</span> command line
21 </p></dd></dl></div><p>
22 </p></div><div class="refsect1" id="id-1.9.5.12.7"><h2>Usage</h2><div class="refsect2" id="id-1.9.5.12.7.2"><h3>Interpreting Results</h3><p>
23 Good results will show most (>90%) individual timing calls take less than
24 one microsecond. Average per loop overhead will be even lower, below 100
25 nanoseconds. This example from an Intel i7-860 system using a TSC clock
26 source shows excellent performance:
28 </p><pre class="screen">
29 Testing timing overhead for 3 seconds.
30 Per loop time including overhead: 35.96 ns
31 Histogram of timing durations:
32 < us % of total count
40 Note that different units are used for the per loop time than the
41 histogram. The loop can have resolution within a few nanoseconds (ns),
42 while the individual timing calls can only resolve down to one microsecond
44 </p></div><div class="refsect2" id="id-1.9.5.12.7.3"><h3>Measuring Executor Timing Overhead</h3><p>
45 When the query executor is running a statement using
46 <code class="command">EXPLAIN ANALYZE</code>, individual operations are timed as well
47 as showing a summary. The overhead of your system can be checked by
48 counting rows with the <span class="application">psql</span> program:
50 </p><pre class="screen">
51 CREATE TABLE t AS SELECT * FROM generate_series(1,100000);
53 SELECT COUNT(*) FROM t;
54 EXPLAIN ANALYZE SELECT COUNT(*) FROM t;
57 The i7-860 system measured runs the count query in 9.8 ms while
58 the <code class="command">EXPLAIN ANALYZE</code> version takes 16.6 ms, each
59 processing just over 100,000 rows. That 6.8 ms difference means the timing
60 overhead per row is 68 ns, about twice what pg_test_timing estimated it
61 would be. Even that relatively small amount of overhead is making the fully
62 timed count statement take almost 70% longer. On more substantial queries,
63 the timing overhead would be less problematic.
64 </p></div><div class="refsect2" id="id-1.9.5.12.7.4"><h3>Changing Time Sources</h3><p>
65 On some newer Linux systems, it's possible to change the clock source used
66 to collect timing data at any time. A second example shows the slowdown
67 possible from switching to the slower acpi_pm time source, on the same
68 system used for the fast results above:
70 </p><pre class="screen">
71 # cat /sys/devices/system/clocksource/clocksource0/available_clocksource
73 # echo acpi_pm > /sys/devices/system/clocksource/clocksource0/current_clocksource
75 Per loop time including overhead: 722.92 ns
76 Histogram of timing durations:
77 < us % of total count
85 In this configuration, the sample <code class="command">EXPLAIN ANALYZE</code> above
86 takes 115.9 ms. That's 1061 ns of timing overhead, again a small multiple
87 of what's measured directly by this utility. That much timing overhead
88 means the actual query itself is only taking a tiny fraction of the
89 accounted for time, most of it is being consumed in overhead instead. In
90 this configuration, any <code class="command">EXPLAIN ANALYZE</code> totals involving
91 many timed operations would be inflated significantly by timing overhead.
93 FreeBSD also allows changing the time source on the fly, and it logs
94 information about the timer selected during boot:
96 </p><pre class="screen">
97 # dmesg | grep "Timecounter"
98 Timecounter "ACPI-fast" frequency 3579545 Hz quality 900
99 Timecounter "i8254" frequency 1193182 Hz quality 0
100 Timecounters tick every 10.000 msec
101 Timecounter "TSC" frequency 2531787134 Hz quality 800
102 # sysctl kern.timecounter.hardware=TSC
103 kern.timecounter.hardware: ACPI-fast -> TSC
106 Other systems may only allow setting the time source on boot. On older
107 Linux systems the "clock" kernel setting is the only way to make this sort
108 of change. And even on some more recent ones, the only option you'll see
109 for a clock source is "jiffies". Jiffies are the older Linux software clock
110 implementation, which can have good resolution when it's backed by fast
111 enough timing hardware, as in this example:
113 </p><pre class="screen">
114 $ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
116 $ dmesg | grep time.c
117 time.c: Using 3.579545 MHz WALL PM GTOD PIT/TSC timer.
118 time.c: Detected 2400.153 MHz processor.
120 Testing timing overhead for 3 seconds.
121 Per timing duration including loop overhead: 97.75 ns
122 Histogram of timing durations:
123 < us % of total count
130 </pre></div><div class="refsect2" id="id-1.9.5.12.7.5"><h3>Clock Hardware and Timing Accuracy</h3><p>
131 Collecting accurate timing information is normally done on computers using
132 hardware clocks with various levels of accuracy. With some hardware the
133 operating systems can pass the system clock time almost directly to
134 programs. A system clock can also be derived from a chip that simply
135 provides timing interrupts, periodic ticks at some known time interval. In
136 either case, operating system kernels provide a clock source that hides
137 these details. But the accuracy of that clock source and how quickly it can
138 return results varies based on the underlying hardware.
140 Inaccurate time keeping can result in system instability. Test any change
141 to the clock source very carefully. Operating system defaults are sometimes
142 made to favor reliability over best accuracy. And if you are using a virtual
143 machine, look into the recommended time sources compatible with it. Virtual
144 hardware faces additional difficulties when emulating timers, and there are
145 often per operating system settings suggested by vendors.
147 The Time Stamp Counter (TSC) clock source is the most accurate one available
148 on current generation CPUs. It's the preferred way to track the system time
149 when it's supported by the operating system and the TSC clock is
150 reliable. There are several ways that TSC can fail to provide an accurate
151 timing source, making it unreliable. Older systems can have a TSC clock that
152 varies based on the CPU temperature, making it unusable for timing. Trying
153 to use TSC on some older multicore CPUs can give a reported time that's
154 inconsistent among multiple cores. This can result in the time going
155 backwards, a problem this program checks for. And even the newest systems
156 can fail to provide accurate TSC timing with very aggressive power saving
159 Newer operating systems may check for the known TSC problems and switch to a
160 slower, more stable clock source when they are seen. If your system
161 supports TSC time but doesn't default to that, it may be disabled for a good
162 reason. And some operating systems may not detect all the possible problems
163 correctly, or will allow using TSC even in situations where it's known to be
166 The High Precision Event Timer (HPET) is the preferred timer on systems
167 where it's available and TSC is not accurate. The timer chip itself is
168 programmable to allow up to 100 nanosecond resolution, but you may not see
169 that much accuracy in your system clock.
171 Advanced Configuration and Power Interface (ACPI) provides a Power
172 Management (PM) Timer, which Linux refers to as the acpi_pm. The clock
173 derived from acpi_pm will at best provide 300 nanosecond resolution.
175 Timers used on older PC hardware include the 8254 Programmable Interval
176 Timer (PIT), the real-time clock (RTC), the Advanced Programmable Interrupt
177 Controller (APIC) timer, and the Cyclone timer. These timers aim for
178 millisecond resolution.
179 </p></div></div><div class="refsect1" id="id-1.9.5.12.8"><h2>See Also</h2><span class="simplelist"><a class="xref" href="sql-explain.html" title="EXPLAIN"><span class="refentrytitle">EXPLAIN</span></a></span></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="pgtestfsync.html" title="pg_test_fsync">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="reference-server.html" title="PostgreSQL Server Applications">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="pgupgrade.html" title="pg_upgrade">Next</a></td></tr><tr><td width="40%" align="left" valign="top"><span class="application">pg_test_fsync</span> </td><td width="20%" align="center"><a accesskey="h" href="index.html" title="PostgreSQL 18.0 Documentation">Home</a></td><td width="40%" align="right" valign="top"> <span class="application">pg_upgrade</span></td></tr></table></div></body></html>