Skip to content

DO NOT MERGE: inject a memory spike to test benchmark memory reporting - #15

Open
adriangb wants to merge 2 commits into
mainfrom
test/memory-capture-probe
Open

DO NOT MERGE: inject a memory spike to test benchmark memory reporting#15
adriangb wants to merge 2 commits into
mainfrom
test/memory-capture-probe

Conversation

@adriangb

Copy link
Copy Markdown
Owner

DO NOT MERGE. A throwaway branch in this fork whose only purpose is to check that the memory reporting we just built actually catches a large allocation in an operator.

apache/datafusion#23985 records per-query peak MemoryPool reservation as pool_peak_bytes; adriangb/datafusion-benchmarking#19 surfaces it in the benchmark comment next to peak RSS. Neither has ever been shown a spike it was supposed to catch. This branch supplies one.

Two knobs, because there are two channels

They measure different things, and a test that moved both at once would not tell you which one did the work:

env var what it does should move
DF_INJECT_POOL_BYTES grows a MemoryReservation against the task's pool, allocating nothing pool_peak_bytes only
DF_INJECT_ALLOC_BYTES allocates and writes a buffer, telling the pool nothing — what an under-accounting operator actually does peak RSS only

Both unset by default, so the build behaves normally until asked for a spike.

The injection goes in FilterExec::execute and is held for the stream's lifetime. FilterExec::execute runs once per partition and a plan can hold several filters, so a process-wide flag keeps at most one injection live: the spike is a fixed size rather than a multiple of the partition count, which on a 12-partition plan would turn a 1 GiB knob into 12 GiB and exhaust the pool.

The reservation uses grow, not try_grow — the point is to record a peak, not to test the limit, and a failure there would fail the query rather than report anything.

Local results

dfbench tpch --query 1 -i 1 against SF1 parquet, release build, each knob at 1G:

run pool_peak_bytes max RSS
no knobs, --memory-limit 8G 41.9 MB 184.8 MB
DF_INJECT_POOL_BYTES=1G 1,076,859,936 (+1.00 GiB) 180.9 MB (unmoved)
DF_INJECT_ALLOC_BYTES=1G 31.5 MB (unmoved) 1,259,405,312 (+1.00 GiB)
both knobs, no --memory-limit field absent 1,255,948,288

Each channel moves under exactly its own knob and is untouched by the other, which is the result the design predicts.

The memory limit is required, for the pool number only

The last row is the answer to "do we need a memory limit?". CommonOpt::runtime_env_builder installs a MemoryPool — and therefore PeakRecordingPool — only when a limit is set, so without one there is no pool to record and the query keys come back as ['query', 'iterations', 'start_time', 'success']. The benchmark comment renders that as n/a, correctly.

RSS needs no limit: the runner's process-subtree sampling caught the untracked gigabyte in that run regardless.

So a benchmark run exercising the pool path has to pass DATAFUSION_RUNTIME_MEMORY_LIMIT, set well above the spike — the injected reservation is real as far as the pool is concerned and will push other consumers into spilling or failing if the headroom is not there. 8G against a 1G spike on TPC-H SF1 leaves plenty.

What this does not test

The baseline side of the benchmark comparison. Baseline is the merge-base, which does not carry this file, so the injection appears only on the changed side — which is what makes the delta legible, but also means the comment's per-query table is being asked to display a difference, not to survive both sides having one.

Verification

5 unit tests on the injection itself (parsing, off-by-default, each knob in isolation, the one-at-a-time flag). cargo fmt, cargo clippy -p datafusion-physical-plan --all-targets --all-features -- -D warnings clean.

🤖 Generated with Claude Code

Validates end to end that a large allocation inside an operator is
actually reported by the benchmark harness, now that apache#23985
records per-query peak MemoryPool reservation and
adriangb/datafusion-benchmarking#19 surfaces it in the PR comment.

Two separately sized knobs, off unless set, injected in FilterExec::execute
and held for the stream's lifetime:

* DF_INJECT_POOL_BYTES grows a MemoryReservation without allocating —
  should move pool_peak_bytes and not RSS.
* DF_INJECT_ALLOC_BYTES allocates and writes a buffer without telling the
  pool — should move RSS and not pool_peak_bytes.

A process-wide flag keeps one injection live at a time, so the spike is a
fixed size rather than a multiple of the partition count.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@adriangb

Copy link
Copy Markdown
Owner Author

run benchmark tpch
env:
DATAFUSION_RUNTIME_MEMORY_LIMIT: 8G
changed:
env:
DF_INJECT_POOL_BYTES: 1G
DF_INJECT_ALLOC_BYTES: 1G

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5136696853-1313-hdpjm 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing test/memory-capture-probe (f0f42e9) to 1ae6b87 (merge-base) diff using: tpch
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and test_memory-capture-probe
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ Query     ┃                           HEAD ┃      test_memory-capture-probe ┃       Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩
│ QQuery 1  │ 38.40 / 39.13 ±0.94 / 40.95 ms │ 52.35 / 56.31 ±7.54 / 71.40 ms │ 1.44x slower │
│ QQuery 2  │ 19.31 / 20.09 ±1.15 / 22.34 ms │ 32.78 / 33.00 ±0.19 / 33.31 ms │ 1.64x slower │
│ QQuery 3  │ 30.98 / 32.41 ±1.44 / 34.31 ms │ 44.03 / 46.20 ±1.49 / 48.04 ms │ 1.43x slower │
│ QQuery 4  │ 17.69 / 17.85 ±0.17 / 18.16 ms │ 27.90 / 28.04 ±0.16 / 28.25 ms │ 1.57x slower │
│ QQuery 5  │ 37.87 / 39.89 ±1.60 / 41.49 ms │ 52.04 / 54.30 ±1.97 / 57.94 ms │ 1.36x slower │
│ QQuery 6  │ 16.44 / 16.50 ±0.04 / 16.55 ms │ 24.88 / 26.69 ±3.15 / 32.98 ms │ 1.62x slower │
│ QQuery 7  │ 43.89 / 45.73 ±1.37 / 47.52 ms │ 57.50 / 58.81 ±0.96 / 59.81 ms │ 1.29x slower │
│ QQuery 8  │ 42.53 / 44.19 ±1.16 / 45.42 ms │ 56.63 / 58.50 ±1.99 / 61.69 ms │ 1.32x slower │
│ QQuery 9  │ 48.96 / 50.37 ±0.77 / 51.07 ms │ 51.90 / 56.78 ±6.19 / 67.80 ms │ 1.13x slower │
│ QQuery 10 │ 42.48 / 42.86 ±0.22 / 43.11 ms │ 43.05 / 43.90 ±0.93 / 45.30 ms │    no change │
│ QQuery 11 │ 13.59 / 13.65 ±0.08 / 13.81 ms │ 41.65 / 42.07 ±0.44 / 42.89 ms │ 3.08x slower │
│ QQuery 12 │ 24.26 / 25.40 ±0.98 / 26.97 ms │ 37.60 / 38.59 ±1.13 / 40.80 ms │ 1.52x slower │
│ QQuery 13 │ 33.01 / 35.26 ±1.81 / 37.62 ms │ 47.11 / 51.84 ±7.63 / 67.05 ms │ 1.47x slower │
│ QQuery 14 │ 23.37 / 23.63 ±0.22 / 23.89 ms │ 38.30 / 38.93 ±0.66 / 40.13 ms │ 1.65x slower │
│ QQuery 15 │ 31.08 / 31.24 ±0.20 / 31.63 ms │ 59.12 / 59.74 ±0.47 / 60.55 ms │ 1.91x slower │
│ QQuery 16 │ 13.74 / 13.86 ±0.09 / 13.98 ms │ 25.13 / 25.21 ±0.06 / 25.32 ms │ 1.82x slower │
│ QQuery 17 │ 70.10 / 70.89 ±0.77 / 72.31 ms │ 81.57 / 83.54 ±1.25 / 85.17 ms │ 1.18x slower │
│ QQuery 18 │ 58.42 / 60.81 ±1.45 / 62.29 ms │ 72.34 / 79.44 ±8.21 / 95.20 ms │ 1.31x slower │
│ QQuery 19 │ 32.94 / 33.77 ±1.44 / 36.64 ms │ 43.20 / 43.67 ±0.66 / 44.99 ms │ 1.29x slower │
│ QQuery 20 │ 31.60 / 31.80 ±0.20 / 32.06 ms │ 40.36 / 40.81 ±0.30 / 41.29 ms │ 1.28x slower │
│ QQuery 21 │ 53.98 / 55.31 ±0.92 / 56.43 ms │ 56.16 / 58.32 ±2.17 / 62.49 ms │ 1.05x slower │
│ QQuery 22 │ 13.85 / 13.99 ±0.15 / 14.26 ms │ 36.12 / 36.39 ±0.20 / 36.68 ms │ 2.60x slower │
└───────────┴────────────────────────────────┴────────────────────────────────┴──────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Benchmark Summary                        ┃           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ Total Time (HEAD)                        │  758.59ms │
│ Total Time (test_memory-capture-probe)   │ 1061.10ms │
│ Average Time (HEAD)                      │   34.48ms │
│ Average Time (test_memory-capture-probe) │   48.23ms │
│ Queries Faster                           │         0 │
│ Queries Slower                           │        21 │
│ Queries with No Change                   │         1 │
│ Queries with Failure                     │         0 │
└──────────────────────────────────────────┴───────────┘

Memory Pool Peaks

Peak MemoryPool reservation per query — what DataFusion's accounting believes it reserved. Recorded only when the benchmark runs with DATAFUSION_RUNTIME_MEMORY_LIMIT set.

Base: 1ae6b87 (merge-base) | Changed: test/memory-capture-probe

tpchtpch_sf1

Query Base Changed Change
Query 1 40.0 MiB 1.0 GiB +2467.0%
Query 2 31.4 MiB 1.0 GiB +3162.1%
Query 3 23.1 MiB 1.0 GiB +4347.9%
Query 4 33.3 MiB 1.0 GiB +2982.9%
Query 5 44.1 MiB 1.0 GiB +2221.8%
Query 6 0 B 1.0 GiB n/a
Query 7 121.3 MiB 1.0 GiB +744.2%
Query 8 33.0 MiB 1.0 GiB +3004.4%
Query 9 134.0 MiB 1.1 GiB +755.1%
Query 10 38.0 MiB 1.0 GiB +2693.9%
Query 11 62.3 MiB 1.0 GiB +1611.9%
Query 12 20.0 MiB 1.0 GiB +5019.6%
Query 13 50.4 MiB 1.0 GiB +1975.2%
Query 14 7.9 MiB 1.0 GiB +12881.4%
Query 15 12.8 MiB 1.0 GiB +7974.8%
Query 16 45.5 MiB 1.0 GiB +2155.2%
Query 17 141.3 MiB 1.0 GiB +624.6%
Query 18 308.6 MiB 1.2 GiB +281.7%
Query 19 721.1 KiB 1.0 GiB +145422.5%
Query 20 80.2 MiB 1.0 GiB +1177.8%
Query 21 104.6 MiB 1.1 GiB +979.4%
Query 22 42.5 MiB 1.0 GiB +2311.3%

Pool accounting vs. process RSS

Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.

Benchmark Side Max pool peak Peak RSS Gap RSS / pool
tpch base (1ae6b87 (merge-base)) 308.6 MiB 1.2 GiB 876.2 MiB 3.8×
tpch changed (test/memory-capture-probe) 1.2 GiB 3.0 GiB 1.9 GiB 2.6×
Resource Usage

tpch — base (merge-base)

Metric Value
Wall time 5.0s
Peak memory 1.2 GiB
Avg memory 497.2 MiB
CPU user 21.6s
CPU sys 1.8s
Peak spill 0 B

tpch — branch

Metric Value
Wall time 10.0s
Peak memory 3.0 GiB
Avg memory 948.7 MiB
CPU user 25.9s
CPU sys 2.2s
Peak spill 0 B

File an issue against this benchmark runner

Removed MemoryInjection references from FilterExec.
@adriangb

Copy link
Copy Markdown
Owner Author

run benchmark tpch

env:
  DATAFUSION_RUNTIME_MEMORY_LIMIT: 8G
changed:
  env:
    DF_INJECT_POOL_BYTES: 1G
    DF_INJECT_ALLOC_BYTES: 1G

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5139115520-1317-jmvt6 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing test/memory-capture-probe (9484811) to 1ae6b87 (merge-base) diff using: tpch
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and test_memory-capture-probe
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Query     ┃                           HEAD ┃      test_memory-capture-probe ┃    Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ QQuery 1  │ 38.34 / 39.02 ±0.98 / 40.93 ms │ 38.28 / 39.31 ±1.19 / 40.88 ms │ no change │
│ QQuery 2  │ 19.38 / 19.83 ±0.67 / 21.16 ms │ 19.24 / 19.48 ±0.26 / 19.97 ms │ no change │
│ QQuery 3  │ 31.28 / 32.80 ±1.13 / 33.80 ms │ 31.29 / 32.85 ±1.14 / 33.88 ms │ no change │
│ QQuery 4  │ 17.70 / 18.25 ±0.75 / 19.70 ms │ 17.49 / 17.82 ±0.19 / 18.08 ms │ no change │
│ QQuery 5  │ 38.11 / 40.31 ±1.18 / 41.65 ms │ 37.67 / 39.61 ±1.72 / 41.93 ms │ no change │
│ QQuery 6  │ 16.09 / 16.79 ±1.00 / 18.77 ms │ 16.15 / 16.31 ±0.10 / 16.42 ms │ no change │
│ QQuery 7  │ 43.66 / 45.70 ±2.23 / 49.59 ms │ 42.78 / 44.90 ±1.39 / 46.45 ms │ no change │
│ QQuery 8  │ 43.01 / 43.57 ±0.88 / 45.31 ms │ 42.48 / 43.83 ±1.18 / 45.58 ms │ no change │
│ QQuery 9  │ 48.75 / 50.44 ±1.19 / 51.53 ms │ 49.13 / 50.12 ±1.02 / 51.55 ms │ no change │
│ QQuery 10 │ 42.13 / 42.38 ±0.17 / 42.66 ms │ 42.21 / 42.36 ±0.11 / 42.52 ms │ no change │
│ QQuery 11 │ 13.18 / 13.75 ±0.59 / 14.86 ms │ 13.34 / 13.51 ±0.10 / 13.61 ms │ no change │
│ QQuery 12 │ 24.00 / 24.46 ±0.28 / 24.80 ms │ 23.81 / 24.18 ±0.49 / 25.11 ms │ no change │
│ QQuery 13 │ 32.84 / 34.96 ±2.20 / 38.85 ms │ 32.52 / 35.45 ±1.76 / 37.68 ms │ no change │
│ QQuery 14 │ 23.35 / 24.10 ±1.18 / 26.46 ms │ 23.59 / 23.82 ±0.34 / 24.49 ms │ no change │
│ QQuery 15 │ 31.37 / 31.59 ±0.29 / 32.16 ms │ 31.10 / 31.85 ±0.49 / 32.40 ms │ no change │
│ QQuery 16 │ 13.82 / 13.94 ±0.07 / 14.01 ms │ 13.71 / 13.84 ±0.08 / 13.97 ms │ no change │
│ QQuery 17 │ 70.81 / 71.16 ±0.30 / 71.69 ms │ 70.69 / 72.11 ±1.37 / 73.88 ms │ no change │
│ QQuery 18 │ 60.02 / 61.47 ±1.76 / 64.83 ms │ 57.34 / 59.47 ±1.38 / 61.53 ms │ no change │
│ QQuery 19 │ 32.91 / 33.80 ±1.51 / 36.82 ms │ 33.02 / 33.36 ±0.30 / 33.84 ms │ no change │
│ QQuery 20 │ 31.97 / 32.33 ±0.33 / 32.92 ms │ 31.85 / 32.08 ±0.19 / 32.33 ms │ no change │
│ QQuery 21 │ 53.72 / 56.45 ±1.60 / 58.76 ms │ 53.84 / 56.31 ±1.27 / 57.25 ms │ no change │
│ QQuery 22 │ 13.94 / 14.13 ±0.12 / 14.27 ms │ 13.85 / 14.00 ±0.09 / 14.11 ms │ no change │
└───────────┴────────────────────────────────┴────────────────────────────────┴───────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                        ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                        │ 761.21ms │
│ Total Time (test_memory-capture-probe)   │ 756.57ms │
│ Average Time (HEAD)                      │  34.60ms │
│ Average Time (test_memory-capture-probe) │  34.39ms │
│ Queries Faster                           │        0 │
│ Queries Slower                           │        0 │
│ Queries with No Change                   │       22 │
│ Queries with Failure                     │        0 │
└──────────────────────────────────────────┴──────────┘

Memory Pool Peaks

Peak MemoryPool reservation per query — what DataFusion's accounting believes it reserved. Recorded only when the benchmark runs with DATAFUSION_RUNTIME_MEMORY_LIMIT set.

Base: 1ae6b87 (merge-base) | Changed: test/memory-capture-probe

tpchtpch_sf1

Query Base Changed Change
Query 1 40.0 MiB 30.0 MiB -25.0%
Query 2 32.0 MiB 28.5 MiB -10.9%
Query 3 25.0 MiB 22.1 MiB -11.3%
Query 4 33.5 MiB 33.3 MiB -0.6%
Query 5 40.7 MiB 41.5 MiB +1.8%
Query 6 0 B 0 B 0.0%
Query 7 120.9 MiB 119.7 MiB -1.0%
Query 8 32.6 MiB 32.6 MiB +0.0%
Query 9 132.5 MiB 134.5 MiB +1.5%
Query 10 39.8 MiB 41.4 MiB +4.3%
Query 11 31.9 MiB 51.3 MiB +61.0%
Query 12 20.0 MiB 20.0 MiB -0.0%
Query 13 60.4 MiB 60.4 MiB +0.0%
Query 14 7.5 MiB 7.5 MiB +0.2%
Query 15 12.4 MiB 12.2 MiB -1.7%
Query 16 45.0 MiB 55.0 MiB +22.1%
Query 17 141.3 MiB 141.3 MiB +0.0%
Query 18 307.1 MiB 308.1 MiB +0.3%
Query 19 721.1 KiB 721.1 KiB +0.0%
Query 20 80.1 MiB 80.7 MiB +0.7%
Query 21 91.4 MiB 100.6 MiB +10.0%
Query 22 42.2 MiB 42.5 MiB +0.7%

Pool accounting vs. process RSS

Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.

Benchmark Side Max pool peak Peak RSS Gap RSS / pool
tpch base (1ae6b87 (merge-base)) 307.1 MiB 1.2 GiB 900.1 MiB 3.9×
tpch changed (test/memory-capture-probe) 308.1 MiB 1.2 GiB 926.1 MiB 4.0×
Resource Usage

tpch — base (merge-base)

Metric Value
Wall time 5.0s
Peak memory 1.2 GiB
Avg memory 523.5 MiB
CPU user 21.9s
CPU sys 1.6s
Peak spill 0 B

tpch — branch

Metric Value
Wall time 5.0s
Peak memory 1.2 GiB
Avg memory 523.6 MiB
CPU user 21.7s
CPU sys 1.7s
Peak spill 0 B

File an issue against this benchmark runner

@adriangb

Copy link
Copy Markdown
Owner Author

run benchmark tpch

[determinism experiment 1/3] CONTROL

A/A run: both sides are main, so every difference below is pure noise.

Stock allocator settings. Establishes the baseline noise floor to compare 2/3 and 3/3 against.

baseline:
ref: main
changed:
ref: main

@adriangb

Copy link
Copy Markdown
Owner Author

run benchmark tpch

[determinism experiment 2/3] purge + THP disabled

Same A/A setup as 1/3, plus the two cheap mimalloc knobs:

PURGE_DELAY=-1 -> never madvise(DONTNEED) memory back to the OS

(default is 10ms, x10 arena_purge_mult = ~100ms after idle),

which removes the re-fault storms between queries/iterations.

ALLOW_THP=0 -> mimalloc v3 defaults this to 1 on Linux; khugepaged

collapse timing is independent of the workload.

env:
MIMALLOC_PURGE_DELAY: "-1"
MIMALLOC_ALLOW_THP: "0"
MIMALLOC_VERBOSE: "1"
baseline:
ref: main
changed:
ref: main

@adriangb

Copy link
Copy Markdown
Owner Author

run benchmark tpch

[determinism experiment 3/3] purge + THP + pre-committed arena

Everything from 2/3, plus pre-reserve and eagerly commit an 8 GiB arena at

startup so page faults are paid before the first query instead of being

sprinkled through the measured region. Expect RSS to sit at ~8 GiB for both

sides; that is the intended trade (memory for variance), not a regression.

env:
MIMALLOC_PURGE_DELAY: "-1"
MIMALLOC_ALLOW_THP: "0"
MIMALLOC_ARENA_EAGER_COMMIT: "1"
MIMALLOC_RESERVE_OS_MEMORY: "8GIB"
MIMALLOC_ARENA_RESERVE: "8GIB"
MIMALLOC_VERBOSE: "1"
baseline:
ref: main
changed:
ref: main

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5139405485-1324-p7txr 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing main (1ae6b87) to main diff

Run configuration
run benchmark tpch
baseline:
  ref: "main"
changed:
  ref: "main"

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5139405557-1325-qttlm 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing main (1ae6b87) to main diff

Run configuration
run benchmark tpch
env:
  MIMALLOC_ALLOW_THP: "0"
  MIMALLOC_PURGE_DELAY: "-1"
  MIMALLOC_VERBOSE: "1"
baseline:
  ref: "main"
changed:
  ref: "main"

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5139405641-1326-g7wqp 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing main (1ae6b87) to main diff

Run configuration
run benchmark tpch
env:
  MIMALLOC_ALLOW_THP: "0"
  MIMALLOC_ARENA_EAGER_COMMIT: "1"
  MIMALLOC_ARENA_RESERVE: "8GIB"
  MIMALLOC_PURGE_DELAY: "-1"
  MIMALLOC_RESERVE_OS_MEMORY: "8GIB"
  MIMALLOC_VERBOSE: "1"
baseline:
  ref: "main"
changed:
  ref: "main"

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

Comparing main (1ae6b87) to main diff

Run configuration
run benchmark tpch
baseline:
  ref: "main"
changed:
  ref: "main"
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and test_memory-capture-probe
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Query     ┃                           HEAD ┃      test_memory-capture-probe ┃    Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ QQuery 1  │ 37.81 / 39.35 ±1.38 / 41.23 ms │ 37.73 / 38.43 ±1.00 / 40.40 ms │ no change │
│ QQuery 2  │ 18.81 / 19.21 ±0.32 / 19.80 ms │ 19.03 / 19.27 ±0.24 / 19.63 ms │ no change │
│ QQuery 3  │ 30.18 / 31.84 ±1.32 / 33.49 ms │ 30.88 / 32.12 ±1.16 / 33.81 ms │ no change │
│ QQuery 4  │ 17.12 / 17.64 ±0.69 / 19.00 ms │ 17.11 / 17.57 ±0.61 / 18.79 ms │ no change │
│ QQuery 5  │ 37.23 / 39.41 ±1.23 / 40.94 ms │ 37.99 / 40.48 ±1.99 / 42.97 ms │ no change │
│ QQuery 6  │ 16.06 / 17.04 ±0.94 / 18.48 ms │ 16.11 / 16.64 ±0.43 / 17.37 ms │ no change │
│ QQuery 7  │ 42.60 / 44.53 ±1.66 / 47.29 ms │ 43.57 / 45.52 ±1.12 / 46.91 ms │ no change │
│ QQuery 8  │ 42.12 / 42.92 ±1.12 / 45.10 ms │ 42.20 / 42.51 ±0.24 / 42.85 ms │ no change │
│ QQuery 9  │ 48.41 / 49.70 ±1.06 / 51.54 ms │ 49.19 / 50.33 ±1.14 / 52.01 ms │ no change │
│ QQuery 10 │ 41.64 / 42.68 ±1.26 / 45.13 ms │ 41.70 / 41.81 ±0.11 / 42.00 ms │ no change │
│ QQuery 11 │ 13.11 / 13.41 ±0.28 / 13.88 ms │ 13.05 / 13.19 ±0.11 / 13.37 ms │ no change │
│ QQuery 12 │ 23.74 / 24.07 ±0.28 / 24.44 ms │ 23.61 / 23.80 ±0.12 / 23.98 ms │ no change │
│ QQuery 13 │ 32.28 / 33.45 ±1.09 / 35.37 ms │ 31.51 / 32.72 ±1.12 / 34.75 ms │ no change │
│ QQuery 14 │ 23.21 / 23.35 ±0.09 / 23.47 ms │ 23.22 / 23.38 ±0.10 / 23.49 ms │ no change │
│ QQuery 15 │ 30.41 / 30.80 ±0.25 / 31.07 ms │ 30.96 / 31.53 ±0.69 / 32.56 ms │ no change │
│ QQuery 16 │ 13.57 / 13.71 ±0.10 / 13.83 ms │ 13.52 / 13.89 ±0.33 / 14.48 ms │ no change │
│ QQuery 17 │ 69.39 / 70.30 ±1.04 / 72.30 ms │ 69.10 / 69.83 ±0.41 / 70.34 ms │ no change │
│ QQuery 18 │ 57.26 / 58.79 ±1.80 / 62.26 ms │ 56.88 / 58.89 ±1.51 / 60.66 ms │ no change │
│ QQuery 19 │ 32.61 / 33.35 ±1.03 / 35.33 ms │ 32.66 / 33.43 ±0.82 / 34.91 ms │ no change │
│ QQuery 20 │ 31.46 / 31.61 ±0.09 / 31.71 ms │ 31.29 / 31.60 ±0.22 / 31.98 ms │ no change │
│ QQuery 21 │ 54.73 / 56.31 ±1.59 / 58.72 ms │ 52.87 / 55.19 ±1.16 / 55.91 ms │ no change │
│ QQuery 22 │ 13.91 / 14.29 ±0.56 / 15.38 ms │ 13.48 / 13.70 ±0.14 / 13.87 ms │ no change │
└───────────┴────────────────────────────────┴────────────────────────────────┴───────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                        ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                        │ 747.76ms │
│ Total Time (test_memory-capture-probe)   │ 745.85ms │
│ Average Time (HEAD)                      │  33.99ms │
│ Average Time (test_memory-capture-probe) │  33.90ms │
│ Queries Faster                           │        0 │
│ Queries Slower                           │        0 │
│ Queries with No Change                   │       22 │
│ Queries with Failure                     │        0 │
└──────────────────────────────────────────┴──────────┘

Resource Usage

tpch — base (merge-base)

Metric Value
Wall time 5.0s
Peak memory 1.2 GiB
Avg memory 524.1 MiB
CPU user 21.3s
CPU sys 1.6s
Peak spill 0 B

tpch — branch

Metric Value
Wall time 5.0s
Peak memory 1.3 GiB
Avg memory 528.3 MiB
CPU user 21.4s
CPU sys 1.6s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

Comparing main (1ae6b87) to main diff

Run configuration
run benchmark tpch
env:
  MIMALLOC_ALLOW_THP: "0"
  MIMALLOC_PURGE_DELAY: "-1"
  MIMALLOC_VERBOSE: "1"
baseline:
  ref: "main"
changed:
  ref: "main"
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and test_memory-capture-probe
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Query     ┃                           HEAD ┃      test_memory-capture-probe ┃    Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ QQuery 1  │ 39.59 / 41.53 ±2.24 / 45.75 ms │ 39.58 / 41.64 ±2.26 / 45.50 ms │ no change │
│ QQuery 2  │ 20.37 / 20.94 ±0.48 / 21.65 ms │ 20.46 / 21.17 ±0.47 / 21.90 ms │ no change │
│ QQuery 3  │ 32.75 / 34.46 ±1.77 / 37.55 ms │ 33.05 / 35.13 ±1.59 / 37.77 ms │ no change │
│ QQuery 4  │ 17.82 / 18.47 ±0.80 / 20.02 ms │ 17.96 / 18.33 ±0.27 / 18.68 ms │ no change │
│ QQuery 5  │ 39.72 / 41.27 ±1.45 / 43.23 ms │ 41.63 / 42.81 ±0.83 / 44.01 ms │ no change │
│ QQuery 6  │ 16.90 / 17.12 ±0.23 / 17.43 ms │ 16.86 / 17.16 ±0.41 / 17.96 ms │ no change │
│ QQuery 7  │ 46.60 / 48.30 ±1.36 / 50.56 ms │ 46.07 / 48.30 ±1.89 / 50.89 ms │ no change │
│ QQuery 8  │ 44.09 / 44.26 ±0.13 / 44.42 ms │ 44.10 / 44.88 ±1.16 / 47.19 ms │ no change │
│ QQuery 9  │ 51.59 / 53.30 ±1.89 / 56.93 ms │ 51.89 / 53.18 ±1.49 / 55.32 ms │ no change │
│ QQuery 10 │ 44.07 / 44.57 ±0.26 / 44.79 ms │ 44.70 / 45.11 ±0.39 / 45.74 ms │ no change │
│ QQuery 11 │ 14.01 / 14.48 ±0.56 / 15.56 ms │ 14.25 / 14.86 ±0.96 / 16.78 ms │ no change │
│ QQuery 12 │ 25.04 / 25.17 ±0.09 / 25.27 ms │ 24.73 / 25.58 ±1.15 / 27.84 ms │ no change │
│ QQuery 13 │ 33.01 / 35.03 ±1.32 / 36.88 ms │ 33.12 / 35.41 ±1.47 / 37.27 ms │ no change │
│ QQuery 14 │ 24.29 / 24.47 ±0.13 / 24.64 ms │ 24.12 / 24.22 ±0.12 / 24.45 ms │ no change │
│ QQuery 15 │ 32.04 / 32.34 ±0.17 / 32.50 ms │ 32.13 / 32.58 ±0.59 / 33.75 ms │ no change │
│ QQuery 16 │ 14.25 / 14.45 ±0.11 / 14.55 ms │ 14.23 / 14.52 ±0.19 / 14.78 ms │ no change │
│ QQuery 17 │ 74.66 / 76.06 ±0.93 / 77.12 ms │ 75.32 / 77.49 ±1.86 / 80.07 ms │ no change │
│ QQuery 18 │ 61.49 / 62.97 ±1.91 / 66.63 ms │ 62.97 / 64.07 ±0.88 / 65.46 ms │ no change │
│ QQuery 19 │ 34.22 / 35.22 ±1.29 / 37.58 ms │ 34.36 / 35.23 ±0.95 / 36.98 ms │ no change │
│ QQuery 20 │ 32.79 / 33.05 ±0.20 / 33.39 ms │ 32.76 / 33.30 ±0.29 / 33.59 ms │ no change │
│ QQuery 21 │ 57.60 / 58.72 ±0.86 / 59.96 ms │ 59.47 / 60.74 ±1.15 / 62.62 ms │ no change │
│ QQuery 22 │ 14.80 / 14.96 ±0.14 / 15.21 ms │ 14.59 / 14.78 ±0.11 / 14.93 ms │ no change │
└───────────┴────────────────────────────────┴────────────────────────────────┴───────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                        ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                        │ 791.16ms │
│ Total Time (test_memory-capture-probe)   │ 800.50ms │
│ Average Time (HEAD)                      │  35.96ms │
│ Average Time (test_memory-capture-probe) │  36.39ms │
│ Queries Faster                           │        0 │
│ Queries Slower                           │        0 │
│ Queries with No Change                   │       22 │
│ Queries with Failure                     │        0 │
└──────────────────────────────────────────┴──────────┘

Resource Usage

tpch — base (merge-base)

Metric Value
Wall time 5.0s
Peak memory 1012.3 MiB
Avg memory 414.6 MiB
CPU user 23.0s
CPU sys 2.0s
Peak spill 0 B

tpch — branch

Metric Value
Wall time 5.0s
Peak memory 1.1 GiB
Avg memory 592.5 MiB
CPU user 23.3s
CPU sys 1.9s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

Comparing main (1ae6b87) to main diff

Run configuration
run benchmark tpch
env:
  MIMALLOC_ALLOW_THP: "0"
  MIMALLOC_ARENA_EAGER_COMMIT: "1"
  MIMALLOC_ARENA_RESERVE: "8GIB"
  MIMALLOC_PURGE_DELAY: "-1"
  MIMALLOC_RESERVE_OS_MEMORY: "8GIB"
  MIMALLOC_VERBOSE: "1"
baseline:
  ref: "main"
changed:
  ref: "main"
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and test_memory-capture-probe
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                           HEAD ┃      test_memory-capture-probe ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │ 40.08 / 42.38 ±2.79 / 47.71 ms │ 38.58 / 40.93 ±3.24 / 47.36 ms │     no change │
│ QQuery 2  │ 20.70 / 21.44 ±0.69 / 22.41 ms │ 19.86 / 20.27 ±0.41 / 21.04 ms │ +1.06x faster │
│ QQuery 3  │ 32.03 / 34.28 ±2.10 / 38.12 ms │ 31.62 / 34.00 ±2.04 / 36.85 ms │     no change │
│ QQuery 4  │ 17.37 / 17.95 ±0.67 / 19.11 ms │ 17.59 / 17.78 ±0.15 / 18.00 ms │     no change │
│ QQuery 5  │ 39.44 / 41.38 ±1.20 / 43.14 ms │ 39.30 / 41.41 ±1.31 / 43.43 ms │     no change │
│ QQuery 6  │ 16.24 / 16.46 ±0.14 / 16.65 ms │ 16.36 / 17.25 ±1.08 / 18.72 ms │     no change │
│ QQuery 7  │ 44.81 / 46.70 ±1.85 / 50.10 ms │ 45.07 / 46.31 ±1.74 / 49.76 ms │     no change │
│ QQuery 8  │ 42.80 / 43.33 ±0.63 / 44.57 ms │ 43.02 / 43.91 ±0.70 / 44.87 ms │     no change │
│ QQuery 9  │ 49.73 / 50.47 ±0.97 / 52.36 ms │ 50.23 / 51.24 ±0.96 / 52.87 ms │     no change │
│ QQuery 10 │ 42.48 / 43.26 ±0.81 / 44.83 ms │ 42.46 / 42.88 ±0.31 / 43.37 ms │     no change │
│ QQuery 11 │ 13.52 / 13.73 ±0.20 / 14.08 ms │ 13.57 / 13.60 ±0.02 / 13.63 ms │     no change │
│ QQuery 12 │ 24.60 / 26.37 ±1.74 / 29.47 ms │ 23.87 / 24.23 ±0.25 / 24.59 ms │ +1.09x faster │
│ QQuery 13 │ 32.40 / 32.95 ±0.40 / 33.53 ms │ 31.77 / 32.98 ±0.77 / 33.94 ms │     no change │
│ QQuery 14 │ 23.26 / 23.52 ±0.18 / 23.81 ms │ 23.39 / 23.51 ±0.09 / 23.60 ms │     no change │
│ QQuery 15 │ 31.18 / 32.00 ±0.85 / 33.21 ms │ 30.86 / 31.78 ±1.08 / 33.70 ms │     no change │
│ QQuery 16 │ 13.86 / 13.95 ±0.08 / 14.08 ms │ 14.44 / 14.67 ±0.20 / 15.00 ms │  1.05x slower │
│ QQuery 17 │ 71.42 / 72.74 ±1.12 / 74.59 ms │ 79.94 / 82.68 ±1.99 / 85.75 ms │  1.14x slower │
│ QQuery 18 │ 60.39 / 62.83 ±1.36 / 64.36 ms │ 68.29 / 69.53 ±1.13 / 71.21 ms │  1.11x slower │
│ QQuery 19 │ 33.44 / 34.07 ±0.98 / 36.00 ms │ 35.51 / 35.75 ±0.21 / 36.14 ms │     no change │
│ QQuery 20 │ 31.50 / 32.26 ±0.52 / 33.10 ms │ 35.11 / 35.32 ±0.13 / 35.47 ms │  1.09x slower │
│ QQuery 21 │ 55.42 / 55.95 ±0.63 / 57.13 ms │ 62.01 / 64.19 ±1.62 / 66.82 ms │  1.15x slower │
│ QQuery 22 │ 13.84 / 14.13 ±0.18 / 14.38 ms │ 15.68 / 15.84 ±0.09 / 15.92 ms │  1.12x slower │
└───────────┴────────────────────────────────┴────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                        ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                        │ 772.16ms │
│ Total Time (test_memory-capture-probe)   │ 800.06ms │
│ Average Time (HEAD)                      │  35.10ms │
│ Average Time (test_memory-capture-probe) │  36.37ms │
│ Queries Faster                           │        2 │
│ Queries Slower                           │        6 │
│ Queries with No Change                   │       14 │
│ Queries with Failure                     │        0 │
└──────────────────────────────────────────┴──────────┘

Resource Usage

tpch — base (merge-base)

Metric Value
Wall time 5.0s
Peak memory 1.1 GiB
Avg memory 443.5 MiB
CPU user 22.3s
CPU sys 1.9s
Peak spill 0 B

tpch — branch

Metric Value
Wall time 5.0s
Peak memory 1.2 GiB
Avg memory 637.9 MiB
CPU user 23.4s
CPU sys 2.0s
Peak spill 0 B

File an issue against this benchmark runner

adriangb added a commit to adriangb/datafusion-benchmarking that referenced this pull request Jul 31, 2026
`bench.sh compare_detail` reduces each query's iterations to the mean
before deciding faster/slower/no-change. Both sides run sequentially in
one pod on a spot node, so a slow iteration is usually the node
interfering rather than the query — the mean folds that in, the min
discards it.

Measured on an A/A run (identical SHAs on both sides, so every reported
difference is noise):

               per-query err    worst    aggregate
  mean              1.29%       4.31%      -0.26%
  min               0.55%       3.52%      +0.00%

adriangb/datafusion#15 (issuecomment-5139405485).

The `compare` subcommand already reduces on min, so the verdict table is
now that one. `compare_detail` still follows it: the min/mean±stddev/max
spread is what makes an unstable query legible as unstable rather than
as a regression, and dropping it would cost more than it saves.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants