# HP llfix physical core placement comparison

2026-10-09. Continues the [qualified original sender CPU pin repair](RECORD_2026-10-08_llfix-hp-affinity.md).

## Experiment

The user installed the reviewed v2 payloads and executed the prepared home
wrapper. All sixteen native client/server pairs completed with zero return
codes. The original sender's built-in CPU announcement and every observed
native affinity agree with each requested placement. The earlier launcher-only
generation's failed reversed run remains invalid at its original pin.

The four client/server placements are 17/16, 16/17, 9/8 and 8/9. Each runs the
original unpaced sender with the larger receiver buffer, followed by the
100000 calls/second paced sender with the default receiver buffer. The same
eight conditions repeat in reverse order. Each fresh pair has one million
measured client calls and 1000 warmups. Controller and observers stay on 0-7;
capture holds both host CPU pools at high priority. Cold auditing uses only
shared/high.

Every selected CPU is a different physical core, with no SMT sibling, on one
socket and NUMA node. The NIC ports belong to that same node. The physical
SFC9220 DAC, separate namespaces, disabled Onload TCP loopback shortcuts,
performance governor, disabled turbo, existing isolation policy and native
arguments remain fixed. There is no additional idle constraint or persistent
OS change. The original sender changes only its documented compiled CPU
constant; the exact old CPU17 binary and all receiver/paced binaries are reused.

## What this tests

The existing baseline already had the client on CPU17 and server on CPU16.
This is a comparison of four separate-core placements and their direction,
not a one-core versus two-core experiment. The known failed earlier run put
both endpoints on CPU17 unintentionally and cannot serve as a controlled
same-core timing baseline.

The probe is local message construction and SDK send-return service time.
It does not measure application RTT or per-call remote delivery. The unpaced
original and paced framework lanes have distinct boundaries and buffering;
compare placements within each lane. The original retains upstream native
statistics. The paced lane separately retains full primary and scheduler
series. Original RDTSCP/frequency conversion is unchanged in both lanes.
Pacing does not reconstruct missed virtual arrivals and is not declared free
of coordinated omission.

## Results

Values are medians of two per-run statistics, not pooled quantiles.
Each maximum is the largest actual maximum across the two runs.
Two repeats do not establish confidence intervals.

| Client/server cores | Original p50 ns | Original p99 us | Paced p50 ns | Paced p99 us |
| --- | ---: | ---: | ---: | ---: |
| 17/16 | 654.5 | 2.6915 | 1454 | 3.7615 |
| 16/17 | 689 | 2.8190 | 1452 | 3.7025 |
| 9/8 | 654 | 2.6675 | 1471 | 3.7170 |
| 8/9 | 688 | 2.7145 | 1478 | 3.7540 |

## Complete primary statistics

| Client/server | Lane | p50 ns | p95 ns | p99 us | Mean ns | Largest maximum ms |
| --- | --- | ---: | ---: | ---: | ---: | ---: |
| 17/16 | original-rx16 | 654.5 | 2171 | 2.6915 | 1969.315 | 55.686200 |
| 17/16 | rate-100000 | 1454 | 2971.5 | 3.7615 | 1661.989 | 55.848136 |
| 16/17 | original-rx16 | 689 | 2204 | 2.8190 | 1963.578 | 53.708000 |
| 16/17 | rate-100000 | 1452 | 2952.5 | 3.7025 | 1629.129 | 21.620736 |
| 9/8 | original-rx16 | 654 | 2148 | 2.6675 | 1977.386 | 53.879600 |
| 9/8 | rate-100000 | 1471 | 2969.5 | 3.7170 | 1652.894 | 23.255787 |
| 8/9 | original-rx16 | 688 | 2209 | 2.7145 | 1971.807 | 49.155000 |
| 8/9 | rate-100000 | 1478 | 3005 | 3.7540 | 1665.553 | 23.816640 |

## Individual primary runs

| Run | Client/server | Lane | p50 ns | p95 ns | p99 us | Mean ns | Actual maximum ms |
| --- | --- | --- | ---: | ---: | ---: | ---: | ---: |
| 1 | 17/16 | original-rx16 | 659 | 2189 | 2.7050 | 1964.552 | 50.486600 |
| 2 | 17/16 | rate-100000 | 1444 | 2976 | 3.8030 | 1679.633 | 55.848136 |
| 3 | 16/17 | original-rx16 | 661 | 2189 | 2.7990 | 1945.767 | 45.250200 |
| 4 | 16/17 | rate-100000 | 1469 | 2974 | 3.7320 | 1638.414 | 18.767082 |
| 5 | 9/8 | original-rx16 | 651 | 2161 | 2.6400 | 1979.256 | 50.818200 |
| 6 | 9/8 | rate-100000 | 1480 | 2971 | 3.7050 | 1653.837 | 18.086107 |
| 7 | 8/9 | original-rx16 | 720 | 2230 | 2.7660 | 1963.059 | 49.155000 |
| 8 | 8/9 | rate-100000 | 1518 | 3006 | 3.7610 | 1702.974 | 22.223034 |
| 9 | 8/9 | rate-100000 | 1438 | 3004 | 3.7470 | 1628.132 | 23.816640 |
| 10 | 8/9 | original-rx16 | 656 | 2188 | 2.6630 | 1980.554 | 45.118100 |
| 11 | 9/8 | rate-100000 | 1462 | 2968 | 3.7290 | 1651.950 | 23.255787 |
| 12 | 9/8 | original-rx16 | 657 | 2135 | 2.6950 | 1975.515 | 53.879600 |
| 13 | 16/17 | rate-100000 | 1435 | 2931 | 3.6730 | 1619.845 | 21.620736 |
| 14 | 16/17 | original-rx16 | 717 | 2219 | 2.8390 | 1981.389 | 53.708000 |
| 15 | 17/16 | rate-100000 | 1464 | 2967 | 3.7200 | 1644.346 | 23.730345 |
| 16 | 17/16 | original-rx16 | 650 | 2153 | 2.6780 | 1974.079 | 55.686200 |

## Paced scheduler statistics

Scheduler delays stay separate from primary service time. Rates are observed
completed calls divided by the measured wall duration, not a throughput limit.

| Client/server | Delay p50 ns | Delay p95 ns | Delay p99 ns | Delay mean ns | Largest delay ms | Achieved calls/s |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| 17/16 | 67.5 | 102 | 105 | 173.249 | 55.978306 | 98297.599 |
| 16/17 | 67 | 102 | 105 | 144.927 | 21.665083 | 98571.485 |
| 9/8 | 67.5 | 102 | 105 | 148.975 | 23.304285 | 98532.139 |
| 8/9 | 67.5 | 102 | 105 | 154.611 | 23.871332 | 98477.410 |

## Decision

Retain the existing 17/16 placement. Moving to 9/8 leaves unpaced p50 nearly
identical (654.5 versus 654 ns) and lowers p99 by approximately 0.89% in these
two-repeat medians. Its paced p50 is higher. Reversing the endpoints raises
unpaced median p50 to 689 ns on 16/17 and 688 ns on 8/9; the individual runs
still show substantial variation, including the 8/9 shift from 720 to 656 ns.
There is no consistent improvement across both lanes that supports changing
the default placement. This sample does not establish statistical significance
or prove that every possible placement behaves alike.

Primary maxima remain tens of milliseconds on all placements. Moving cores
does not remove the retained rare stalls. The snapshots do not attribute
individual stalls to firmware, interrupts, scheduler activity or journaling.
The complete series and original unpaced statistics remain available rather
than excluding those samples.

All sixteen independent cold checks pass: 16000000 measured client calls,
32032000 persisted endpoint order records including warmups and both copies,
8000000 paced primary samples and 8000000 scheduler samples. Required field
values, repeating parties, FIX framing/checksum and contiguous numeric owners
pass on both endpoints. Paced full-width CSV and HFTBRW, raw quantiles/mean/true
maxima, clock identity, achieved rate and clamp disclosure pass. Actual receive
buffers are 2098020 bytes for the unpaced lane and 131400 bytes for paced cells.

No new timing, quiet, vendor reproduction or release admission follows from
these observed diagnostics.


## Verification and source identity

The installed preparation and complete 68-file source capsule stay at
`980857324225d1c0c49e5213eaea1c5bbc68d28f`. The current source/support bindings
still pass thirteen preparation checks without skips. GCC11.5, its exact
compiler hash, original C++17/O3/native flags and the complete upstream llfix
1.0.7 reference source remain independently pinned. CPU16/9/8 builds differ
only in `CPU_CORE_INDEX_TO_PIN`; CPU17 reuses its old qualified binary.

The local send-cost comparison remains diagnostic. Timing/report, quiet,
vendor reproduction and release admission are absent. No Stage 2 adapter,
recipe, SDK implementation, shared clock/toolenv/layout API, canonical wire,
old ranking or other session's job changes. No SCAN work is launched.

## Retention

The [summary](evidence/llfix-hp-placement-20261009/metadata/placement-summary1.json)
retains every individual run, primary/delay statistics, actual maxima, achieved
rates, observed single-core counts, socket proofs and physical wire deltas.
The [cold audit](evidence/llfix-hp-placement-20261009/capture/placement-audit.json)
and [capture parent](evidence/llfix-hp-placement-20261009/capture/placement.json)
keep their original bytes, along with all sixteen per-condition capture and
cold-audit receipts. The
[selection manifest](evidence/llfix-hp-placement-20261009/selection-manifest.json)
binds 47 original metadata/source/log files by hash, size and mode.

The first retention helper assumed a separate snapshot PID key; its
[failure](evidence/llfix-hp-placement-20261009/metadata/retention-failure1.log)
and [source](evidence/llfix-hp-placement-20261009/metadata/failed-retain-placement-results1.py)
remain preserved. The second helper used the captured status PID and found
another incorrect reader assumption: raw series are under the nested native
pair directory. That
[failure](evidence/llfix-hp-placement-20261009/metadata/retention-failure2.log)
and [source](evidence/llfix-hp-placement-20261009/metadata/failed-retain-placement-results2.py)
are also retained. The
[successful helper](evidence/llfix-hp-placement-20261009/metadata/retain-placement-results3.py)
reads both actual layouts, validates all original snapshots and raw hashes,
and leaves the frozen controllers, capture, numerical results and passing
cold grades unchanged.

Both hosts stream-verify all 404 files, 27111660095 raw bytes and 594062491
compressed bytes in
`~/archive/libhft/codex-llfix-reference-20261009/hp-placement-results1.tar.gz`.
Their [HP](evidence/llfix-hp-placement-20261009/hp-replica1.json) and
[Beelink](evidence/llfix-hp-placement-20261009/beelink-replica1.json) receipts
agree exactly. Complete journals, CSV/HFTBRW series, all 68 source files,
prepared native payloads/launchers/manifests and the original private-mode
home-run log remain in those full replicas and the uncompressed HP primary.
Archive SHA256:
`34e2791616bcdb27c74f4826d4f64df4271cb4ae5b949a15e18b45b58f97f65c`.
Seal SHA256:
`558c40c6177061218e6ed1a3cf0a19b05c7c4e07eb6121c71eb6a08861d340b1`.

The [integration verifier](evidence/llfix-hp-placement-20261009/verify-integration.py)
checks eight current placement/support source bindings, all selected metadata,
both replicas, sixteen native/cold result vectors, aggregate statistics, local
links and thirteen boundary tests without a native rerun or timing promotion.
The [initial passing receipt](evidence/llfix-hp-placement-20261009/integration1.json)
retains thirteen tests, zero skips and all sixteen original native pairs.

After both replicas passed, [guarded cleanup](evidence/llfix-hp-placement-20261009/cleanup1.json)
removed only this completed capture runtime and its disposable staging copy.
The [cleaner](evidence/llfix-hp-placement-20261009/cleanup-results1.py) checked
their exact sealed file shape/hashes/modes, both replicas and all 32 native
PID/start identities first. All 68 frozen source files, root-owned payloads,
uncompressed primary evidence and both full compressed archives remain.
The successful functional receipt and old source/runtime generations remain
active read-only inputs. Other host jobs and checkouts are untouched.

After normal integration over concurrent private-main changes, the
[post-rebase receipt](evidence/llfix-hp-placement-20261009/integration2.json)
again passes all eight current source bindings, 47 selected evidence files,
sixteen retained result vectors and thirteen boundary tests with zero skips.
The frozen HP source/runtime stays at its original `980857324225` pin.
