| From: | "Joel Jacobson" <joel(at)compiler(dot)org> |
|---|---|
| To: | "Heikki Linnakangas" <hlinnaka(at)iki(dot)fi>, "Tom Lane" <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
| Cc: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
| Subject: | Re: LISTEN/NOTIFY bug: VACUUM sets frozenxid past a xid in async queue |
| Date: | 2025-10-30 23:08:04 |
| Message-ID: | e1e4909b-66b9-43d8-8942-529b7519c758@app.fastmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Thu, Oct 30, 2025, at 14:25, Heikki Linnakangas wrote:
> Joel, since you've been working on some optimizations in this area too,
> would you happen to have some suitable performance test scripts for this?
Glad you asked. I'm actually working on a benchmark+correctness tester.
It's very much work-in-progress though, don't look too much at the code,
or your eyes will bleed.
It's a combined benchmark + correctness tester, that verifies that only
the expected notifications are received on the expected connections,
while at the same time doing timing measurements.
```
% ./pg_bench_lino --help
Usage: ./pg_bench_lino [OPTIONS]
PostgreSQL LISTEN/NOTIFY Benchmark Tool (CLI version)
Options:
-c, --connections N Number of database connections (default: 1)
-n, --channels N Number of notification channels (default: 1)
-t, --tick-ms N Tick interval in milliseconds (default: 1)
-l, --listen-prob N LISTEN probability % (default: 0.1, 0 to disable)
-u, --unlisten-prob N UNLISTEN probability % (default: 0.05, 0 to disable)
-p, --notify-prob N NOTIFY probability % (default: 1.0, 0 to disable)
-a, --unlisten-all-prob N UNLISTEN * probability % (default: 0.01, 0 to disable)
-T, --ticks N Number of ticks to run (REQUIRED)
-s, --seed N Random seed for reproducibility (default: current time)
-h, --help Show this help message
```
Example run on my MacBook M3 Max
--- master:
% ./pg_bench_lino -t 0 -c 100 -n 1000 -l 10 -u 0 -p 100 -s 42 -T 10000
Initializing 100 connections and 1000 channels...
Initialization complete. Starting benchmark...
========================================================
PostgreSQL LISTEN/NOTIFY Benchmark Results
========================================================
Configuration:
Connections: 100
Channels: 1000
Tick interval: 0 ms
LISTEN probability: 10.0000%
UNLISTEN probability: 0.0000%
NOTIFY probability: 100.0000%
UNLISTEN * probability: 0.0100%
Ticks executed: 10000
Random seed: 42
Final State:
Active connections: 100
Active channels: 1000
Listening pairs: 989
Correctness errors: 0
========================================================
Operation Statistics:
Operation Count Min(ms) Avg(ms) Max(ms)
--------------------------------------------------------
LISTEN 1009 0.016 0.029 0.291
UNLISTEN 0 - - -
UNLISTEN * 1 0.071 0.071 0.071
NOTIFY 9989 0.064 0.247 2.163
NOTIFY delivery 9989 0.072 0.277 2.170
========================================================
NOTIFY Delivery Time Distribution:
0.05-0.1ms # 4 (0.0%)
0.1-0.15ms ## 263 (2.6%)
0.15-0.2ms ####### 881 (8.8%)
0.2-0.3ms ################################################## 5907 (59.1%)
0.3-0.4ms #################### 2388 (23.9%)
0.4-0.5ms #### 525 (5.3%)
0.5-0.75ms # 18 (0.2%)
1-2ms # 2 (0.0%)
2-5ms # 1 (0.0%)
-- Optimization v22 patch:
% ./pg_bench_lino -t 0 -c 100 -n 1000 -l 10 -u 0 -p 100 -s 42 -T 10000
Initializing 100 connections and 1000 channels...
Initialization complete. Starting benchmark...
========================================================
PostgreSQL LISTEN/NOTIFY Benchmark Results
========================================================
Configuration:
Connections: 100
Channels: 1000
Tick interval: 0 ms
LISTEN probability: 10.0000%
UNLISTEN probability: 0.0000%
NOTIFY probability: 100.0000%
UNLISTEN * probability: 0.0100%
Ticks executed: 10000
Random seed: 42
Final State:
Active connections: 100
Active channels: 1000
Listening pairs: 989
Correctness errors: 0
========================================================
Operation Statistics:
Operation Count Min(ms) Avg(ms) Max(ms)
--------------------------------------------------------
LISTEN 1009 0.015 0.023 0.340
UNLISTEN 0 - - -
UNLISTEN * 1 0.056 0.056 0.056
NOTIFY 9989 0.018 0.031 2.037
NOTIFY delivery 9989 0.022 0.062 2.056
========================================================
NOTIFY Delivery Time Distribution:
0-0.05ms ################################################## 5002 (50.1%)
0.05-0.1ms ######################################### 4130 (41.3%)
0.1-0.15ms # 77 (0.8%)
0.15-0.2ms #### 427 (4.3%)
0.2-0.3ms ### 338 (3.4%)
0.3-0.4ms # 11 (0.1%)
0.4-0.5ms # 1 (0.0%)
2-5ms # 3 (0.0%)
To compile:
gcc -Wall -Wextra -g -I"$(pg_config --includedir)" -c pg_bench_lino.c -o pg_bench_lino.o
gcc pg_bench_lino.o -L"$(pg_config --libdir)" -lpq -o pg_bench_lino
/Joel
| Attachment | Content-Type | Size |
|---|---|---|
| pg_bench_lino.c | application/octet-stream | 33.7 KB |
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Alexander Korotkov | 2025-10-30 23:08:17 | Re: Resetting recovery target parameters in pg_createsubscriber |
| Previous Message | David Rowley | 2025-10-30 22:41:03 | Re: Potential bug introduced in PG17 with query parallelization - plan flip |