]> begriffs open source - ai-pg/blob - full-docs/man1/pg_test_timing.1
Convert HTML docs to more streamlined TXT
[ai-pg] / full-docs / man1 / pg_test_timing.1
1 '\" t
2 .\"     Title: pg_test_timing
3 .\"    Author: The PostgreSQL Global Development Group
4 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
5 .\"      Date: 2025
6 .\"    Manual: PostgreSQL 18.0 Documentation
7 .\"    Source: PostgreSQL 18.0
8 .\"  Language: English
9 .\"
10 .TH "PG_TEST_TIMING" "1" "2025" "PostgreSQL 18.0" "PostgreSQL 18.0 Documentation"
11 .\" -----------------------------------------------------------------
12 .\" * Define some portability stuff
13 .\" -----------------------------------------------------------------
14 .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15 .\" http://bugs.debian.org/507673
16 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
17 .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18 .ie \n(.g .ds Aq \(aq
19 .el       .ds Aq '
20 .\" -----------------------------------------------------------------
21 .\" * set default formatting
22 .\" -----------------------------------------------------------------
23 .\" disable hyphenation
24 .nh
25 .\" disable justification (adjust text to left margin only)
26 .ad l
27 .\" -----------------------------------------------------------------
28 .\" * MAIN CONTENT STARTS HERE *
29 .\" -----------------------------------------------------------------
30 .SH "NAME"
31 pg_test_timing \- measure timing overhead
32 .SH "SYNOPSIS"
33 .HP \w'\fBpg_test_timing\fR\ 'u
34 \fBpg_test_timing\fR [\fIoption\fR...]
35 .SH "DESCRIPTION"
36 .PP
37 pg_test_timing
38 is a tool to measure the timing overhead on your system and confirm that the system time never moves backwards\&. Systems that are slow to collect timing data can give less accurate
39 \fBEXPLAIN ANALYZE\fR
40 results\&.
41 .SH "OPTIONS"
42 .PP
43 pg_test_timing
44 accepts the following command\-line options:
45 .PP
46 \fB\-d \fR\fB\fIduration\fR\fR
47 .br
48 \fB\-\-duration=\fR\fB\fIduration\fR\fR
49 .RS 4
50 Specifies the test duration, in seconds\&. Longer durations give slightly better accuracy, and are more likely to discover problems with the system clock moving backwards\&. The default test duration is 3 seconds\&.
51 .RE
52 .PP
53 \fB\-V\fR
54 .br
55 \fB\-\-version\fR
56 .RS 4
57 Print the
58 pg_test_timing
59 version and exit\&.
60 .RE
61 .PP
62 \fB\-?\fR
63 .br
64 \fB\-\-help\fR
65 .RS 4
66 Show help about
67 pg_test_timing
68 command line arguments, and exit\&.
69 .RE
70 .SH "USAGE"
71 .SS "Interpreting Results"
72 .PP
73 Good results will show most (>90%) individual timing calls take less than one microsecond\&. Average per loop overhead will be even lower, below 100 nanoseconds\&. This example from an Intel i7\-860 system using a TSC clock source shows excellent performance:
74 .sp
75 .if n \{\
76 .RS 4
77 .\}
78 .nf
79 Testing timing overhead for 3 seconds\&.
80 Per loop time including overhead: 35\&.96 ns
81 Histogram of timing durations:
82   < us   % of total      count
83      1     96\&.40465   80435604
84      2      3\&.59518    2999652
85      4      0\&.00015        126
86      8      0\&.00002         13
87     16      0\&.00000          2
88 .fi
89 .if n \{\
90 .RE
91 .\}
92 .PP
93 Note that different units are used for the per loop time than the histogram\&. The loop can have resolution within a few nanoseconds (ns), while the individual timing calls can only resolve down to one microsecond (us)\&.
94 .SS "Measuring Executor Timing Overhead"
95 .PP
96 When the query executor is running a statement using
97 \fBEXPLAIN ANALYZE\fR, individual operations are timed as well as showing a summary\&. The overhead of your system can be checked by counting rows with the
98 psql
99 program:
100 .sp
101 .if n \{\
102 .RS 4
103 .\}
104 .nf
105 CREATE TABLE t AS SELECT * FROM generate_series(1,100000);
106 \etiming
107 SELECT COUNT(*) FROM t;
108 EXPLAIN ANALYZE SELECT COUNT(*) FROM t;
109 .fi
110 .if n \{\
111 .RE
112 .\}
113 .PP
114 The i7\-860 system measured runs the count query in 9\&.8 ms while the
115 \fBEXPLAIN ANALYZE\fR
116 version takes 16\&.6 ms, each processing just over 100,000 rows\&. That 6\&.8 ms difference means the timing overhead per row is 68 ns, about twice what pg_test_timing estimated it would be\&. Even that relatively small amount of overhead is making the fully timed count statement take almost 70% longer\&. On more substantial queries, the timing overhead would be less problematic\&.
117 .SS "Changing Time Sources"
118 .PP
119 On some newer Linux systems, it\*(Aqs possible to change the clock source used to collect timing data at any time\&. A second example shows the slowdown possible from switching to the slower acpi_pm time source, on the same system used for the fast results above:
120 .sp
121 .if n \{\
122 .RS 4
123 .\}
124 .nf
125 # cat /sys/devices/system/clocksource/clocksource0/available_clocksource
126 tsc hpet acpi_pm
127 # echo acpi_pm > /sys/devices/system/clocksource/clocksource0/current_clocksource
128 # pg_test_timing
129 Per loop time including overhead: 722\&.92 ns
130 Histogram of timing durations:
131   < us   % of total      count
132      1     27\&.84870    1155682
133      2     72\&.05956    2990371
134      4      0\&.07810       3241
135      8      0\&.01357        563
136     16      0\&.00007          3
137 .fi
138 .if n \{\
139 .RE
140 .\}
141 .PP
142 In this configuration, the sample
143 \fBEXPLAIN ANALYZE\fR
144 above takes 115\&.9 ms\&. That\*(Aqs 1061 ns of timing overhead, again a small multiple of what\*(Aqs measured directly by this utility\&. That much timing overhead means the actual query itself is only taking a tiny fraction of the accounted for time, most of it is being consumed in overhead instead\&. In this configuration, any
145 \fBEXPLAIN ANALYZE\fR
146 totals involving many timed operations would be inflated significantly by timing overhead\&.
147 .PP
148 FreeBSD also allows changing the time source on the fly, and it logs information about the timer selected during boot:
149 .sp
150 .if n \{\
151 .RS 4
152 .\}
153 .nf
154 # dmesg | grep "Timecounter"
155 Timecounter "ACPI\-fast" frequency 3579545 Hz quality 900
156 Timecounter "i8254" frequency 1193182 Hz quality 0
157 Timecounters tick every 10\&.000 msec
158 Timecounter "TSC" frequency 2531787134 Hz quality 800
159 # sysctl kern\&.timecounter\&.hardware=TSC
160 kern\&.timecounter\&.hardware: ACPI\-fast \-> TSC
161 .fi
162 .if n \{\
163 .RE
164 .\}
165 .PP
166 Other systems may only allow setting the time source on boot\&. On older Linux systems the "clock" kernel setting is the only way to make this sort of change\&. And even on some more recent ones, the only option you\*(Aqll see for a clock source is "jiffies"\&. Jiffies are the older Linux software clock implementation, which can have good resolution when it\*(Aqs backed by fast enough timing hardware, as in this example:
167 .sp
168 .if n \{\
169 .RS 4
170 .\}
171 .nf
172 $ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
173 jiffies
174 $ dmesg | grep time\&.c
175 time\&.c: Using 3\&.579545 MHz WALL PM GTOD PIT/TSC timer\&.
176 time\&.c: Detected 2400\&.153 MHz processor\&.
177 $ pg_test_timing
178 Testing timing overhead for 3 seconds\&.
179 Per timing duration including loop overhead: 97\&.75 ns
180 Histogram of timing durations:
181   < us   % of total      count
182      1     90\&.23734   27694571
183      2      9\&.75277    2993204
184      4      0\&.00981       3010
185      8      0\&.00007         22
186     16      0\&.00000          1
187     32      0\&.00000          1
188 .fi
189 .if n \{\
190 .RE
191 .\}
192 .SS "Clock Hardware and Timing Accuracy"
193 .PP
194 Collecting accurate timing information is normally done on computers using hardware clocks with various levels of accuracy\&. With some hardware the operating systems can pass the system clock time almost directly to programs\&. A system clock can also be derived from a chip that simply provides timing interrupts, periodic ticks at some known time interval\&. In either case, operating system kernels provide a clock source that hides these details\&. But the accuracy of that clock source and how quickly it can return results varies based on the underlying hardware\&.
195 .PP
196 Inaccurate time keeping can result in system instability\&. Test any change to the clock source very carefully\&. Operating system defaults are sometimes made to favor reliability over best accuracy\&. And if you are using a virtual machine, look into the recommended time sources compatible with it\&. Virtual hardware faces additional difficulties when emulating timers, and there are often per operating system settings suggested by vendors\&.
197 .PP
198 The Time Stamp Counter (TSC) clock source is the most accurate one available on current generation CPUs\&. It\*(Aqs the preferred way to track the system time when it\*(Aqs supported by the operating system and the TSC clock is reliable\&. There are several ways that TSC can fail to provide an accurate timing source, making it unreliable\&. Older systems can have a TSC clock that varies based on the CPU temperature, making it unusable for timing\&. Trying to use TSC on some older multicore CPUs can give a reported time that\*(Aqs inconsistent among multiple cores\&. This can result in the time going backwards, a problem this program checks for\&. And even the newest systems can fail to provide accurate TSC timing with very aggressive power saving configurations\&.
199 .PP
200 Newer operating systems may check for the known TSC problems and switch to a slower, more stable clock source when they are seen\&. If your system supports TSC time but doesn\*(Aqt default to that, it may be disabled for a good reason\&. And some operating systems may not detect all the possible problems correctly, or will allow using TSC even in situations where it\*(Aqs known to be inaccurate\&.
201 .PP
202 The High Precision Event Timer (HPET) is the preferred timer on systems where it\*(Aqs available and TSC is not accurate\&. The timer chip itself is programmable to allow up to 100 nanosecond resolution, but you may not see that much accuracy in your system clock\&.
203 .PP
204 Advanced Configuration and Power Interface (ACPI) provides a Power Management (PM) Timer, which Linux refers to as the acpi_pm\&. The clock derived from acpi_pm will at best provide 300 nanosecond resolution\&.
205 .PP
206 Timers used on older PC hardware include the 8254 Programmable Interval Timer (PIT), the real\-time clock (RTC), the Advanced Programmable Interrupt Controller (APIC) timer, and the Cyclone timer\&. These timers aim for millisecond resolution\&.
207 .SH "SEE ALSO"
208 \fBEXPLAIN\fR(7)