Re: LISTEN/NOTIFY bug: VACUUM sets frozenxid past a xid in async queue - Mailing list pgsql-hackers

From Joel Jacobson
Subject Re: LISTEN/NOTIFY bug: VACUUM sets frozenxid past a xid in async queue
Date
Msg-id e1e4909b-66b9-43d8-8942-529b7519c758@app.fastmail.com
Whole thread Raw
In response to Re: LISTEN/NOTIFY bug: VACUUM sets frozenxid past a xid in async queue  (Heikki Linnakangas <hlinnaka@iki.fi>)
Responses Re: LISTEN/NOTIFY bug: VACUUM sets frozenxid past a xid in async queue
List 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

pgsql-hackers by date:

Previous
From: David Rowley
Date:
Subject: Re: Potential bug introduced in PG17 with query parallelization - plan flip
Next
From: Alexander Korotkov
Date:
Subject: Re: Resetting recovery target parameters in pg_createsubscriber