Snapshot of verae-nats-cluster (optimal NATS config study)

This commit is contained in:
George Lambert 2026-09-12 02:06:10 -04:00
commit 8639ca27ee
184 changed files with 10626 additions and 0 deletions

49
BENCH.md Normal file
View file

@ -0,0 +1,49 @@
# NATS cluster message speed
Run **`20260912T045131Z`** (UTC). Client: LXC **510** `verae-px-worker` (`10.10.10.20`), not a nats-* server. Servers: `nats-a/b/c` on `10.10.10.2123` (`vmbr1` only).
Client URL:
```text
nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
```
## Method
- **Core NATS** is fire-and-forget pub/sub (`nats bench`). No disk, no replica ack.
- **JetStream** uses **file** storage and **replicas=3** (same as product streams). The unique stream `benchstream` is deleted between JS loads.
- Throughput is **msgs/sec** from nats CLI **0.1.6** (`--no-progress --csv`). Its min/avg/max are publisher **rate spread**, not delay.
- **Ping** delay: one publisher, sequential publish-then-wait. This is one-message round-trip through the cluster.
- **Flood** delay: N publishers dump the whole batch, then the subscriber drains. This is **queueing under burst**, not wire RTT.
- Probe: `scripts/latency.mjs` (two connections, header timestamp).
## Throughput
| Run | Mode | Aggregate msgs/s | Pub msgs/s | Pub MB/s | Sub msgs/s | Sub MB/s |
|-----|------|------------------|------------|----------|------------|----------|
| `core-1p1s-50k-128` | core pub/sub | 1,200,836 | 791,094 | 96.57 | 747,461 | 91.24 |
| `core-4p4s-100k-128` | core pub/sub | 1,521,256 | 316,312 | 38.61 | 1,299,634 | 158.65 |
| `core-4p4s-50k-1k` | core pub/sub | 630,460 | 247,747 | 241.94 | 510,216 | 498.26 |
| `core-8p8s-200k-128` | core pub/sub | 2,007,937 | 333,957 | 40.77 | 1,790,736 | 218.60 |
| `js-1p-20k-128-r3` | jetstream r=3 file | — | 16,155 | 1.97 | — | — |
| `js-2p2s-20k-128-r3` | jetstream r=3 file | 21,861 | 10,965 | 1.34 | 10,942 | 1.34 |
| `js-4p-20k-1k-r3` | jetstream r=3 file | — | 13,493 | 13.18 | — | — |
| `js-4p-50k-128-r3` | jetstream r=3 file | — | 16,607 | 2.03 | — | — |
## Round-trip delay
| Run | Kind | Count | Pubs | Size | min | avg | p50 | p90 | p99 | max |
|-----|------|-------|------|------|-----|-----|-----|-----|-----|-----|
| `lat-ping-1k-128` | ping (sequential RTT) | 1000 | 1 | 128 B | 0.254ms | 0.307ms | 0.286ms | 0.332ms | 0.734ms | 2.763ms |
| `lat-1p-5k-128` | flood (burst queueing) | 5000 | 1 | 128 B | 149.279ms | 238.626ms | 248.752ms | 274.314ms | 279.398ms | 279.740ms |
| `lat-4p-5k-1k` | flood (burst queueing) | 5000 | 4 | 1024 B | 155.101ms | 211.706ms | 217.579ms | 223.268ms | 227.798ms | 228.370ms |
| `lat-4p-10k-128` | flood (burst queueing) | 10000 | 4 | 128 B | 174.174ms | 263.186ms | 266.672ms | 299.073ms | 304.233ms | 304.475ms |
| `lat-8p-20k-128` | flood (burst queueing) | 20000 | 8 | 128 B | 304.586ms | 453.749ms | 466.296ms | 499.924ms | 505.112ms | 505.620ms |
## What the numbers mean
Product job/event/archive traffic is **JetStream r=3 file**. On this three-LXC stand that is about **16k durable 128 B pubs/s** (about **13k** at 1 KiB). Core NATS is an upper bound for non-durable fan-out: about **0.72.0M msgs/s** aggregate at 128 B, or **~630k msgs/s (~616 MB/s)** at 1 KiB with 4 publishers.
A quiet request-reply is **~0.3 ms** average, **p99 < 1 ms**. Flood rows in the **150500 ms** band are the subscriber catching up after a burst, which is what a job-events mailbox sees if publishers outrun consumers.
Re-run on NS1: `bash scripts/bench.sh`. Raw logs/CSVs are under `results/<utc>/`.

7
NATS.md Normal file
View file

@ -0,0 +1,7 @@
# NATS — verae-nats-cluster
This repo **is** the three-node JetStream cluster. Listeners are the guest private IPs on `vmbr1` (`10.10.10.2123:4222` and `:6222`). HTTP monitor is loopback `:8222` inside each guest.
Zapier cloud, browsers, and `vmbr0` never get a NATS socket.
Throughput and delay at several loads: [BENCH.md](BENCH.md).

76
README.md Normal file
View file

@ -0,0 +1,76 @@
# verae-nats-cluster
Three **distinct Proxmox LXC** guests running **NATS JetStream** as a cluster, on the private bridge only. This is the test stand before the same layout moves to separate hardware.
**Forgejo:** https://git.georgelambert.org/marchon/verae-nats-cluster
**SSH:** `ssh://git@git.georgelambert.org:2223/marchon/verae-nats-cluster.git`
| Guest | VMID | `vmbr1` IP | Client | Cluster | Monitor |
|-------|------|------------|--------|---------|---------|
| nats-a | 511 | 10.10.10.21 | `:4222` | `:6222` | `127.0.0.1:8222` |
| nats-b | 512 | 10.10.10.22 | `:4222` | `:6222` | `127.0.0.1:8222` |
| nats-c | 513 | 10.10.10.23 | `:4222` | `:6222` | `127.0.0.1:8222` |
Cluster name: `verae`. Client URL:
```text
nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
```
**Not** on `vmbr0`. **Not** `0.0.0.0`. Host lab NATS on `127.0.0.1:4222` is left running so current keep/fleet/middleware stay up until you cut over.
```bash
# on NS1 (the Proxmox host)
git clone ssh://git@git.georgelambert.org:2223/marchon/verae-nats-cluster.git
cd verae-nats-cluster
bash scripts/create-cluster.sh
bash scripts/status.sh
bash scripts/test.sh
```
Test-env cut-over (keep/fleet/middleware on NS1):
```bash
# 1) create product streams (replicas=3)
bash scripts/ensure-streams.sh
# 2) fleet overlay nats.url + services/*.json already list the three URLs
# 3) restart fleet and keep with NATS_URL from client.env
```
`JETSTREAM_REPLICAS=3` on middleware. Host `127.0.0.1:4222` can stay up unused. Zapier cloud never talks to NATS.
nkeys/mTLS: `verae-nats-accounts` still has the INTERNAL/LEAF sketch. Do **not** enable accounts on this cluster until every client passes credentials in `NATS_URL`. Private `vmbr1` is the current isolation.
## Message speed (throughput + delay)
From a **client that is not a nats-* server** (LXC 510 `verae-px-worker`):
```bash
# on NS1 (hypervisor). Bench client is LXC 510.
bash scripts/bench.sh
# Full study that must run ON NS1 (orchestrator + charts + HTML/PDF):
bash scripts/study-on-ns1.sh
# Maximize cores/RAM + tmpfs JetStream, same ladder, restore ZFS after:
bash scripts/maximize-ns1-study.sh
# Exhaustive factorial (r=1/r=3, file/memory, reconnect, UDP, MQTT) + combined report:
bash scripts/exhaustive-ns1-study.sh
```
That writes `results/<utc>/` and copies a summary to [BENCH.md](BENCH.md). Full write-up with charts (HTML + PDF) is in the progress repo: [nats-cluster-bench](https://zapier.georgelambert.org/packages/zapier-decisions/reports/nats-cluster-bench.pdf). Core NATS is fire-and-forget; JetStream rows use **file** storage and **replicas=3**. Ping delay is sequential RTT; flood delay is queueing under burst.
Latest run (`20260912T045131Z`):
| Kind | Load | Result |
|------|------|--------|
| Core 1p1s 50k×128 B | pub/sub | ~1.20M msgs/s aggregate |
| Core 8p8s 200k×128 B | pub/sub | ~2.01M msgs/s aggregate |
| Core 4p4s 50k×1 KiB | pub/sub | ~630k msgs/s (~616 MB/s aggregate) |
| JetStream r=3 file | 14 pubs, 128 B | ~16k durable pubs/s |
| JetStream r=3 file | 4 pubs, 1 KiB | ~13.5k durable pubs/s |
| Ping 1k×128 B | sequential RTT | avg 0.307 ms, p99 0.734 ms |
| Flood 8p 20k×128 B | burst queueing | avg 454 ms |
Hardware move: same three configs, three boxes, private NIC only — change IPs in `cluster.env` and `conf/nats.conf.tmpl`.

5
SUMMARY.md Normal file
View file

@ -0,0 +1,5 @@
# verae-nats-cluster
Proxmox LXC 511513 (`nats-a/b/c`) form a JetStream cluster on `vmbr1` for HA testing before dedicated hardware.
Message speed (client LXC 510 vs the three nodes): see [BENCH.md](BENCH.md). Product streams are JetStream **file + replicas=3** (~16k durable 128 B pubs/s on this stand). Core NATS is ~12M msgs/s at 128 B. Sequential RTT ~0.3 ms; flood queueing is hundreds of ms.

3
client.env Normal file
View file

@ -0,0 +1,3 @@
# Test-environment client URL. Private vmbr1 only. Lab loopback stays until cut-over.
export NATS_URL="${NATS_URL:-nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222}"
export JETSTREAM_REPLICAS="${JETSTREAM_REPLICAS:-3}"

19
cluster.env Normal file
View file

@ -0,0 +1,19 @@
# Distinct Proxmox LXC guests on NS1 vmbr1. Not the host loopback NATS.
BRIDGE="${BRIDGE:-vmbr1}"
GW="${GW:-10.10.10.1}"
MEMORY="${MEMORY:-16384}"
CORES="${CORES:-8}"
DISK="${DISK:-8}"
STORAGE="${STORAGE:-SSD2}"
TEMPLATE="${TEMPLATE:-/var/lib/vz/template/cache/ubuntu-24.04-standard_24.04-2_amd64.tar.zst}"
DNS="${DNS:-8.8.8.8}"
USER_NAME="${USER_NAME:-marchon}"
NATS_VER="${NATS_VER:-2.10.26}"
CLUSTER_NAME="${CLUSTER_NAME:-verae}"
# vmid hostname ipv4
NODES="${NODES:-
511 nats-a 10.10.10.21
512 nats-b 10.10.10.22
513 nats-c 10.10.10.23
}"

19
conf/nats.conf.tmpl Normal file
View file

@ -0,0 +1,19 @@
# JetStream cluster node. Bind the private guest IP only — never vmbr0 / 0.0.0.0.
server_name: {{NAME}}
host: {{IP}}
port: 4222
http: 127.0.0.1:8222
jetstream {
store_dir: /var/lib/nats/jetstream
max_mem: 8G
max_file: 4G
}
cluster {
name: {{CLUSTER}}
listen: {{IP}}:6222
routes: [
{{ROUTES}}
]
}

12
package.json Normal file
View file

@ -0,0 +1,12 @@
{
"name": "verae-nats-cluster",
"version": "0.1.0",
"private": true,
"description": "Three-node NATS JetStream cluster on distinct Proxmox LXC guests (vmbr1 only)",
"scripts": {
"create": "bash scripts/create-cluster.sh",
"test": "bash scripts/test.sh",
"status": "bash scripts/status.sh",
"bench": "bash scripts/bench.sh"
}
}

10
results/.gitignore vendored Normal file
View file

@ -0,0 +1,10 @@
*
!.gitignore
!20260912T045131Z/
!20260912T045131Z/**
!20260912T051237Z/
!20260912T051237Z/**
!20260912T053120Z/
!20260912T053120Z/**
!20260912T055851Z/
!20260912T055851Z/**

View file

@ -0,0 +1,49 @@
# NATS cluster message speed
Run **`20260912T045131Z`** (UTC). Client: LXC **510** `verae-px-worker` (`10.10.10.20`), not a nats-* server. Servers: `nats-a/b/c` on `10.10.10.2123` (`vmbr1` only).
Client URL:
```text
nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
```
## Method
- **Core NATS** is fire-and-forget pub/sub (`nats bench`). No disk, no replica ack.
- **JetStream** uses **file** storage and **replicas=3** (same as product streams). The unique stream `benchstream` is deleted between JS loads.
- Throughput is **msgs/sec** from nats CLI **0.1.6** (`--no-progress --csv`). Its min/avg/max are publisher **rate spread**, not delay.
- **Ping** delay: one publisher, sequential publish-then-wait. This is one-message round-trip through the cluster.
- **Flood** delay: N publishers dump the whole batch, then the subscriber drains. This is **queueing under burst**, not wire RTT.
- Probe: `scripts/latency.mjs` (two connections, header timestamp).
## Throughput
| Run | Mode | Aggregate msgs/s | Pub msgs/s | Pub MB/s | Sub msgs/s | Sub MB/s |
|-----|------|------------------|------------|----------|------------|----------|
| `core-1p1s-50k-128` | core pub/sub | 1,200,836 | 791,094 | 96.57 | 747,461 | 91.24 |
| `core-4p4s-100k-128` | core pub/sub | 1,521,256 | 316,312 | 38.61 | 1,299,634 | 158.65 |
| `core-4p4s-50k-1k` | core pub/sub | 630,460 | 247,747 | 241.94 | 510,216 | 498.26 |
| `core-8p8s-200k-128` | core pub/sub | 2,007,937 | 333,957 | 40.77 | 1,790,736 | 218.60 |
| `js-1p-20k-128-r3` | jetstream r=3 file | — | 16,155 | 1.97 | — | — |
| `js-2p2s-20k-128-r3` | jetstream r=3 file | 21,861 | 10,965 | 1.34 | 10,942 | 1.34 |
| `js-4p-20k-1k-r3` | jetstream r=3 file | — | 13,493 | 13.18 | — | — |
| `js-4p-50k-128-r3` | jetstream r=3 file | — | 16,607 | 2.03 | — | — |
## Round-trip delay
| Run | Kind | Count | Pubs | Size | min | avg | p50 | p90 | p99 | max |
|-----|------|-------|------|------|-----|-----|-----|-----|-----|-----|
| `lat-ping-1k-128` | ping (sequential RTT) | 1000 | 1 | 128 B | 0.254ms | 0.307ms | 0.286ms | 0.332ms | 0.734ms | 2.763ms |
| `lat-1p-5k-128` | flood (burst queueing) | 5000 | 1 | 128 B | 149.279ms | 238.626ms | 248.752ms | 274.314ms | 279.398ms | 279.740ms |
| `lat-4p-5k-1k` | flood (burst queueing) | 5000 | 4 | 1024 B | 155.101ms | 211.706ms | 217.579ms | 223.268ms | 227.798ms | 228.370ms |
| `lat-4p-10k-128` | flood (burst queueing) | 10000 | 4 | 128 B | 174.174ms | 263.186ms | 266.672ms | 299.073ms | 304.233ms | 304.475ms |
| `lat-8p-20k-128` | flood (burst queueing) | 20000 | 8 | 128 B | 304.586ms | 453.749ms | 466.296ms | 499.924ms | 505.112ms | 505.620ms |
## What the numbers mean
Product job/event/archive traffic is **JetStream r=3 file**. On this three-LXC stand that is about **16k durable 128 B pubs/s** (about **13k** at 1 KiB). Core NATS is an upper bound for non-durable fan-out: about **0.72.0M msgs/s** aggregate at 128 B, or **~630k msgs/s (~616 MB/s)** at 1 KiB with 4 publishers.
A quiet request-reply is **~0.3 ms** average, **p99 < 1 ms**. Flood rows in the **150500 ms** band are the subscriber catching up after a burst, which is what a job-events mailbox sees if publishers outrun consumers.
Re-run on NS1: `bash scripts/bench.sh`. Raw logs/CSVs are under `results/<utc>/`.

View file

@ -0,0 +1,3 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
8e1ExxrZ9OtHTkwXsOfzes,S0,50000,6400000,747461,95675134.125326,0.066893
8e1ExxrZ9OtHTkwXsOfzes,P0,50000,6400000,791094,101260059.613379,0.063204
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 8e1ExxrZ9OtHTkwXsOfzes S0 50000 6400000 747461 95675134.125326 0.066893
3 8e1ExxrZ9OtHTkwXsOfzes P0 50000 6400000 791094 101260059.613379 0.063204

View file

@ -0,0 +1,7 @@
=== core-1p1s-50k-128 ===
NATS Pub/Sub stats: 1,200,836 msgs/sec ~ 146.59 MB/sec
Pub stats: 791,094 msgs/sec ~ 96.57 MB/sec
Sub stats: 747,461 msgs/sec ~ 91.24 MB/sec
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,9 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
d1csC8CbCBLYlUMAUVZxpb,S0,100000,12800000,377317,48296660.364795,0.265029
d1csC8CbCBLYlUMAUVZxpb,S1,100000,12800000,351445,44985056.104940,0.284539
d1csC8CbCBLYlUMAUVZxpb,S2,100000,12800000,372973,47740617.289389,0.268116
d1csC8CbCBLYlUMAUVZxpb,S3,100000,12800000,324908,41588310.877432,0.307779
d1csC8CbCBLYlUMAUVZxpb,P0,25000,3200000,524453,67129988.054428,0.047669
d1csC8CbCBLYlUMAUVZxpb,P1,25000,3200000,324337,41515233.366208,0.077080
d1csC8CbCBLYlUMAUVZxpb,P2,25000,3200000,103170,13205778.771206,0.242318
d1csC8CbCBLYlUMAUVZxpb,P3,25000,3200000,79260,10145297.784464,0.315417
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 d1csC8CbCBLYlUMAUVZxpb S0 100000 12800000 377317 48296660.364795 0.265029
3 d1csC8CbCBLYlUMAUVZxpb S1 100000 12800000 351445 44985056.104940 0.284539
4 d1csC8CbCBLYlUMAUVZxpb S2 100000 12800000 372973 47740617.289389 0.268116
5 d1csC8CbCBLYlUMAUVZxpb S3 100000 12800000 324908 41588310.877432 0.307779
6 d1csC8CbCBLYlUMAUVZxpb P0 25000 3200000 524453 67129988.054428 0.047669
7 d1csC8CbCBLYlUMAUVZxpb P1 25000 3200000 324337 41515233.366208 0.077080
8 d1csC8CbCBLYlUMAUVZxpb P2 25000 3200000 103170 13205778.771206 0.242318
9 d1csC8CbCBLYlUMAUVZxpb P3 25000 3200000 79260 10145297.784464 0.315417

View file

@ -0,0 +1,17 @@
=== core-4p4s-100k-128 ===
NATS Pub/Sub stats: 1,521,256 msgs/sec ~ 185.70 MB/sec
Pub stats: 316,312 msgs/sec ~ 38.61 MB/sec
[1] 524,453 msgs/sec ~ 64.02 MB/sec (25000 msgs)
[2] 324,337 msgs/sec ~ 39.59 MB/sec (25000 msgs)
[3] 103,170 msgs/sec ~ 12.59 MB/sec (25000 msgs)
[4] 79,260 msgs/sec ~ 9.68 MB/sec (25000 msgs)
min 79,260 | avg 257,805 | max 524,453 | stddev 181,189 msgs
Sub stats: 1,299,634 msgs/sec ~ 158.65 MB/sec
[1] 377,317 msgs/sec ~ 46.06 MB/sec (100000 msgs)
[2] 351,445 msgs/sec ~ 42.90 MB/sec (100000 msgs)
[3] 372,973 msgs/sec ~ 45.53 MB/sec (100000 msgs)
[4] 324,908 msgs/sec ~ 39.66 MB/sec (100000 msgs)
min 324,908 | avg 356,660 | max 377,317 | stddev 20,785 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,9 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
LXVQ7kvd26BIwiMRRfbr7Z,S0,50000,51200000,169213,173274762.582948,0.295484
LXVQ7kvd26BIwiMRRfbr7Z,S1,50000,51200000,150273,153880103.181538,0.332727
LXVQ7kvd26BIwiMRRfbr7Z,S2,50000,51200000,142138,145550108.197459,0.351769
LXVQ7kvd26BIwiMRRfbr7Z,S3,50000,51200000,132134,135306220.651698,0.378401
LXVQ7kvd26BIwiMRRfbr7Z,P0,12500,12800000,176262,180492467.210335,0.070917
LXVQ7kvd26BIwiMRRfbr7Z,P1,12500,12800000,132211,135384883.941361,0.094545
LXVQ7kvd26BIwiMRRfbr7Z,P2,12500,12800000,70678,72375041.084851,0.176857
LXVQ7kvd26BIwiMRRfbr7Z,P3,12500,12800000,61936,63423297.033934,0.201819
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 LXVQ7kvd26BIwiMRRfbr7Z S0 50000 51200000 169213 173274762.582948 0.295484
3 LXVQ7kvd26BIwiMRRfbr7Z S1 50000 51200000 150273 153880103.181538 0.332727
4 LXVQ7kvd26BIwiMRRfbr7Z S2 50000 51200000 142138 145550108.197459 0.351769
5 LXVQ7kvd26BIwiMRRfbr7Z S3 50000 51200000 132134 135306220.651698 0.378401
6 LXVQ7kvd26BIwiMRRfbr7Z P0 12500 12800000 176262 180492467.210335 0.070917
7 LXVQ7kvd26BIwiMRRfbr7Z P1 12500 12800000 132211 135384883.941361 0.094545
8 LXVQ7kvd26BIwiMRRfbr7Z P2 12500 12800000 70678 72375041.084851 0.176857
9 LXVQ7kvd26BIwiMRRfbr7Z P3 12500 12800000 61936 63423297.033934 0.201819

View file

@ -0,0 +1,17 @@
=== core-4p4s-50k-1k ===
NATS Pub/Sub stats: 630,460 msgs/sec ~ 615.68 MB/sec
Pub stats: 247,747 msgs/sec ~ 241.94 MB/sec
[1] 176,262 msgs/sec ~ 172.13 MB/sec (12500 msgs)
[2] 132,211 msgs/sec ~ 129.11 MB/sec (12500 msgs)
[3] 70,678 msgs/sec ~ 69.02 MB/sec (12500 msgs)
[4] 61,936 msgs/sec ~ 60.49 MB/sec (12500 msgs)
min 61,936 | avg 110,271 | max 176,262 | stddev 46,744 msgs
Sub stats: 510,216 msgs/sec ~ 498.26 MB/sec
[1] 169,213 msgs/sec ~ 165.25 MB/sec (50000 msgs)
[2] 150,273 msgs/sec ~ 146.75 MB/sec (50000 msgs)
[3] 142,138 msgs/sec ~ 138.81 MB/sec (50000 msgs)
[4] 132,134 msgs/sec ~ 129.04 MB/sec (50000 msgs)
min 132,134 | avg 148,439 | max 169,213 | stddev 13,605 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,17 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
HuvulruPjjaqnoHWeFCH2I,S0,200000,25600000,349350,44716843.071789,0.572491
HuvulruPjjaqnoHWeFCH2I,S1,200000,25600000,248162,31764858.924451,0.805922
HuvulruPjjaqnoHWeFCH2I,S2,200000,25600000,244206,31258460.045739,0.818978
HuvulruPjjaqnoHWeFCH2I,S3,200000,25600000,243405,31155913.818220,0.821674
HuvulruPjjaqnoHWeFCH2I,S4,200000,25600000,230550,29510438.641581,0.867490
HuvulruPjjaqnoHWeFCH2I,S5,200000,25600000,231495,29631384.363172,0.863949
HuvulruPjjaqnoHWeFCH2I,S6,200000,25600000,229528,29379679.692357,0.871351
HuvulruPjjaqnoHWeFCH2I,S7,200000,25600000,223842,28651789.197519,0.893487
HuvulruPjjaqnoHWeFCH2I,P0,25000,3200000,152536,19524693.902374,0.163895
HuvulruPjjaqnoHWeFCH2I,P1,25000,3200000,84526,10819333.375159,0.295767
HuvulruPjjaqnoHWeFCH2I,P2,25000,3200000,82017,10498223.303653,0.304813
HuvulruPjjaqnoHWeFCH2I,P3,25000,3200000,57214,7323427.896669,0.436954
HuvulruPjjaqnoHWeFCH2I,P4,25000,3200000,53879,6896566.453658,0.463999
HuvulruPjjaqnoHWeFCH2I,P5,25000,3200000,51420,6581852.801766,0.486185
HuvulruPjjaqnoHWeFCH2I,P6,25000,3200000,48572,6217303.262856,0.514693
HuvulruPjjaqnoHWeFCH2I,P7,25000,3200000,41744,5343333.685114,0.598877
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 HuvulruPjjaqnoHWeFCH2I S0 200000 25600000 349350 44716843.071789 0.572491
3 HuvulruPjjaqnoHWeFCH2I S1 200000 25600000 248162 31764858.924451 0.805922
4 HuvulruPjjaqnoHWeFCH2I S2 200000 25600000 244206 31258460.045739 0.818978
5 HuvulruPjjaqnoHWeFCH2I S3 200000 25600000 243405 31155913.818220 0.821674
6 HuvulruPjjaqnoHWeFCH2I S4 200000 25600000 230550 29510438.641581 0.867490
7 HuvulruPjjaqnoHWeFCH2I S5 200000 25600000 231495 29631384.363172 0.863949
8 HuvulruPjjaqnoHWeFCH2I S6 200000 25600000 229528 29379679.692357 0.871351
9 HuvulruPjjaqnoHWeFCH2I S7 200000 25600000 223842 28651789.197519 0.893487
10 HuvulruPjjaqnoHWeFCH2I P0 25000 3200000 152536 19524693.902374 0.163895
11 HuvulruPjjaqnoHWeFCH2I P1 25000 3200000 84526 10819333.375159 0.295767
12 HuvulruPjjaqnoHWeFCH2I P2 25000 3200000 82017 10498223.303653 0.304813
13 HuvulruPjjaqnoHWeFCH2I P3 25000 3200000 57214 7323427.896669 0.436954
14 HuvulruPjjaqnoHWeFCH2I P4 25000 3200000 53879 6896566.453658 0.463999
15 HuvulruPjjaqnoHWeFCH2I P5 25000 3200000 51420 6581852.801766 0.486185
16 HuvulruPjjaqnoHWeFCH2I P6 25000 3200000 48572 6217303.262856 0.514693
17 HuvulruPjjaqnoHWeFCH2I P7 25000 3200000 41744 5343333.685114 0.598877

View file

@ -0,0 +1,25 @@
=== core-8p8s-200k-128 ===
NATS Pub/Sub stats: 2,007,937 msgs/sec ~ 245.11 MB/sec
Pub stats: 333,957 msgs/sec ~ 40.77 MB/sec
[1] 152,536 msgs/sec ~ 18.62 MB/sec (25000 msgs)
[2] 84,526 msgs/sec ~ 10.32 MB/sec (25000 msgs)
[3] 82,017 msgs/sec ~ 10.01 MB/sec (25000 msgs)
[4] 57,214 msgs/sec ~ 6.98 MB/sec (25000 msgs)
[5] 53,879 msgs/sec ~ 6.58 MB/sec (25000 msgs)
[6] 51,420 msgs/sec ~ 6.28 MB/sec (25000 msgs)
[7] 48,572 msgs/sec ~ 5.93 MB/sec (25000 msgs)
[8] 41,744 msgs/sec ~ 5.10 MB/sec (25000 msgs)
min 41,744 | avg 71,488 | max 152,536 | stddev 33,867 msgs
Sub stats: 1,790,736 msgs/sec ~ 218.60 MB/sec
[1] 349,350 msgs/sec ~ 42.65 MB/sec (200000 msgs)
[2] 248,162 msgs/sec ~ 30.29 MB/sec (200000 msgs)
[3] 244,206 msgs/sec ~ 29.81 MB/sec (200000 msgs)
[4] 243,405 msgs/sec ~ 29.71 MB/sec (200000 msgs)
[5] 230,550 msgs/sec ~ 28.14 MB/sec (200000 msgs)
[6] 231,495 msgs/sec ~ 28.26 MB/sec (200000 msgs)
[7] 229,528 msgs/sec ~ 28.02 MB/sec (200000 msgs)
[8] 223,842 msgs/sec ~ 27.32 MB/sec (200000 msgs)
min 223,842 | avg 250,067 | max 349,350 | stddev 38,364 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,2 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
S0xQOJuOM4PlwAHoh5Bj7f,P0,40000,2560000,16155,2067883.858001,1.237981
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 S0xQOJuOM4PlwAHoh5Bj7f P0 40000 2560000 16155 2067883.858001 1.237981

View file

@ -0,0 +1,5 @@
=== js-1p-20k-128-r3 ===
Pub stats: 16,155 msgs/sec ~ 1.97 MB/sec
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
smN9zLbWAAZER4FjSmfwcO,S0,20126,1280000,5474,700679.773679,1.826797
smN9zLbWAAZER4FjSmfwcO,S1,20130,1280000,5471,700313.845376,1.827752
smN9zLbWAAZER4FjSmfwcO,P0,20000,1280000,8678,1110910.588857,1.152208
smN9zLbWAAZER4FjSmfwcO,P1,20000,1280000,5485,702119.773868,1.823051
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 smN9zLbWAAZER4FjSmfwcO S0 20126 1280000 5474 700679.773679 1.826797
3 smN9zLbWAAZER4FjSmfwcO S1 20130 1280000 5471 700313.845376 1.827752
4 smN9zLbWAAZER4FjSmfwcO P0 20000 1280000 8678 1110910.588857 1.152208
5 smN9zLbWAAZER4FjSmfwcO P1 20000 1280000 5485 702119.773868 1.823051

View file

@ -0,0 +1,13 @@
=== js-2p2s-20k-128-r3 ===
NATS Pub/Sub stats: 21,861 msgs/sec ~ 2.67 MB/sec
Pub stats: 10,965 msgs/sec ~ 1.34 MB/sec
[1] 8,678 msgs/sec ~ 1.06 MB/sec (10000 msgs)
[2] 5,485 msgs/sec ~ 685.66 KB/sec (10000 msgs)
min 5,485 | avg 7,081 | max 8,678 | stddev 1,596 msgs
Sub stats: 10,942 msgs/sec ~ 1.34 MB/sec
[1] 5,474 msgs/sec ~ 684.26 KB/sec (10000 msgs)
[2] 5,471 msgs/sec ~ 683.90 KB/sec (10000 msgs)
min 5,471 | avg 5,472 | max 5,474 | stddev 1 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
zOcPILhowCWfp2PGmHUgqx,P0,10000,5120000,5121,5244574.853257,0.976247
zOcPILhowCWfp2PGmHUgqx,P1,10000,5120000,4281,4383926.080211,1.167903
zOcPILhowCWfp2PGmHUgqx,P2,10000,5120000,3480,3564282.061583,1.436474
zOcPILhowCWfp2PGmHUgqx,P3,10000,5120000,3373,3454449.904903,1.482146
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 zOcPILhowCWfp2PGmHUgqx P0 10000 5120000 5121 5244574.853257 0.976247
3 zOcPILhowCWfp2PGmHUgqx P1 10000 5120000 4281 4383926.080211 1.167903
4 zOcPILhowCWfp2PGmHUgqx P2 10000 5120000 3480 3564282.061583 1.436474
5 zOcPILhowCWfp2PGmHUgqx P3 10000 5120000 3373 3454449.904903 1.482146

View file

@ -0,0 +1,10 @@
=== js-4p-20k-1k-r3 ===
Pub stats: 13,493 msgs/sec ~ 13.18 MB/sec
[1] 5,121 msgs/sec ~ 5.00 MB/sec (5000 msgs)
[2] 4,281 msgs/sec ~ 4.18 MB/sec (5000 msgs)
[3] 3,480 msgs/sec ~ 3.40 MB/sec (5000 msgs)
[4] 3,373 msgs/sec ~ 3.29 MB/sec (5000 msgs)
min 3,373 | avg 4,063 | max 5,121 | stddev 704 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
vZIFpR751J0vbDTJQDYGTN,P0,25000,1600000,6628,848387.283433,1.885931
vZIFpR751J0vbDTJQDYGTN,P1,25000,1600000,5762,737571.570534,2.169281
vZIFpR751J0vbDTJQDYGTN,P2,25000,1600000,4162,532825.280344,3.002861
vZIFpR751J0vbDTJQDYGTN,P3,25000,1600000,4154,531740.716359,3.008985
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 vZIFpR751J0vbDTJQDYGTN P0 25000 1600000 6628 848387.283433 1.885931
3 vZIFpR751J0vbDTJQDYGTN P1 25000 1600000 5762 737571.570534 2.169281
4 vZIFpR751J0vbDTJQDYGTN P2 25000 1600000 4162 532825.280344 3.002861
5 vZIFpR751J0vbDTJQDYGTN P3 25000 1600000 4154 531740.716359 3.008985

View file

@ -0,0 +1,10 @@
=== js-4p-50k-128-r3 ===
Pub stats: 16,607 msgs/sec ~ 2.03 MB/sec
[1] 6,628 msgs/sec ~ 828.50 KB/sec (12500 msgs)
[2] 5,762 msgs/sec ~ 720.28 KB/sec (12500 msgs)
[3] 4,162 msgs/sec ~ 520.34 KB/sec (12500 msgs)
[4] 4,154 msgs/sec ~ 519.28 KB/sec (12500 msgs)
min 4,154 | avg 5,176 | max 6,628 | stddev 1,063 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,2 @@
=== lat-1p-5k-128 ===
{"count":5000,"pubs":1,"size":128,"min_us":149279,"avg_us":238626,"p50_us":248752,"p90_us":274314,"p99_us":279398,"max_us":279740,"min":"149.279ms","avg":"238.626ms","p50":"248.752ms","p90":"274.314ms","p99":"279.398ms","max":"279.740ms"}

View file

@ -0,0 +1,2 @@
=== lat-4p-10k-128 ===
{"count":10000,"pubs":4,"size":128,"min_us":174174,"avg_us":263186,"p50_us":266672,"p90_us":299073,"p99_us":304233,"max_us":304475,"min":"174.174ms","avg":"263.186ms","p50":"266.672ms","p90":"299.073ms","p99":"304.233ms","max":"304.475ms"}

View file

@ -0,0 +1,2 @@
=== lat-4p-5k-1k ===
{"count":5000,"pubs":4,"size":1024,"min_us":155101,"avg_us":211706,"p50_us":217579,"p90_us":223268,"p99_us":227798,"max_us":228370,"min":"155.101ms","avg":"211.706ms","p50":"217.579ms","p90":"223.268ms","p99":"227.798ms","max":"228.370ms"}

View file

@ -0,0 +1,2 @@
=== lat-8p-20k-128 ===
{"count":20000,"pubs":8,"size":128,"min_us":304586,"avg_us":453749,"p50_us":466296,"p90_us":499924,"p99_us":505112,"max_us":505620,"min":"304.586ms","avg":"453.749ms","p50":"466.296ms","p90":"499.924ms","p99":"505.112ms","max":"505.620ms"}

View file

@ -0,0 +1,2 @@
=== lat-ping-1k-128 ===
{"count":1000,"pubs":1,"size":128,"min_us":254,"avg_us":307,"p50_us":286,"p90_us":332,"p99_us":734,"max_us":2763,"min":"0.254ms","avg":"0.307ms","p50":"0.286ms","p90":"0.332ms","p99":"0.734ms","max":"2.763ms"}

View file

@ -0,0 +1,48 @@
# NATS cluster message speed
Run **`20260912T051237Z`** (UTC). Client: LXC **510** `verae-px-worker` (`10.10.10.20`), not a nats-* server. Servers: `nats-a/b/c` on `10.10.10.2123` (`vmbr1` only).
Client URL:
```text
nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
```
## Method
- **Core NATS** is fire-and-forget pub/sub (`nats bench`). No disk, no replica ack.
- **JetStream** uses **file** storage and **replicas=3** (same as product streams). The unique stream `benchstream` is deleted between JS loads.
- Throughput is **msgs/sec** from nats CLI **0.1.6** (`--no-progress --csv`). Its min/avg/max are publisher **rate spread**, not delay.
- **Ping** delay: one publisher, sequential publish-then-wait. This is one-message round-trip through the cluster.
- **Flood** delay: N publishers dump the whole batch, then the subscriber drains. This is **queueing under burst**, not wire RTT.
- Probe: `scripts/latency.mjs` (two connections, header timestamp).
## Throughput
| Run | Mode | Aggregate msgs/s | Pub msgs/s | Pub MB/s | Sub msgs/s | Sub MB/s |
|-----|------|------------------|------------|----------|------------|----------|
| `core-1p1s-50k-128` | core pub/sub | 776,331 | 502,502 | 61.34 | 420,976 | 51.39 |
| `core-4p4s-100k-128` | core pub/sub | 1,278,454 | 379,985 | 46.38 | 1,078,910 | 131.70 |
| `core-4p4s-50k-1k` | core pub/sub | 581,464 | 209,545 | 204.63 | 482,645 | 471.33 |
| `core-8p8s-200k-128` | core pub/sub | 2,065,217 | 333,731 | 40.74 | 1,847,242 | 225.49 |
| `js-2p2s-20k-128-r3` | jetstream r=3 file | 15,416 | — | — | — | — |
| `js-4p-20k-1k-r3` | jetstream r=3 file | — | 14,985 | 14.63 | — | — |
| `js-4p-50k-128-r3` | jetstream r=3 file | — | 17,986 | 2.20 | — | — |
## Round-trip delay
| Run | Kind | Count | Pubs | Size | min | avg | p50 | p90 | p99 | max |
|-----|------|-------|------|------|-----|-----|-----|-----|-----|-----|
| `lat-ping-1k-128` | ping (sequential RTT) | 1000 | 1 | 128 B | 0.341ms | 0.470ms | 0.395ms | 0.651ms | 1.377ms | 3.243ms |
| `lat-1p-5k-128` | flood (burst queueing) | 5000 | 1 | 128 B | 132.425ms | 203.717ms | 204.458ms | 241.750ms | 249.468ms | 249.640ms |
| `lat-4p-5k-1k` | flood (burst queueing) | 5000 | 4 | 1024 B | 196.422ms | 221.264ms | 224.039ms | 233.180ms | 236.798ms | 238.177ms |
| `lat-4p-10k-128` | flood (burst queueing) | 10000 | 4 | 128 B | 211.108ms | 294.925ms | 300.254ms | 314.223ms | 315.551ms | 316.091ms |
| `lat-8p-20k-128` | flood (burst queueing) | 20000 | 8 | 128 B | 280.608ms | 414.972ms | 409.802ms | 513.821ms | 535.394ms | 536.084ms |
## What the numbers mean
Product job/event/archive traffic is **JetStream r=3 file**. On this three-LXC stand that is about **16k durable 128 B pubs/s** (about **13k** at 1 KiB). Core NATS is an upper bound for non-durable fan-out: about **0.72.0M msgs/s** aggregate at 128 B, or **~630k msgs/s (~616 MB/s)** at 1 KiB with 4 publishers.
A quiet request-reply is **~0.3 ms** average, **p99 < 1 ms**. Flood rows in the **150500 ms** band are the subscriber catching up after a burst, which is what a job-events mailbox sees if publishers outrun consumers.
Re-run on NS1: `bash scripts/bench.sh`. Raw logs/CSVs are under `results/<utc>/`.

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View file

@ -0,0 +1,3 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
h0r77ozVkEaFq9NntdbNXL,S0,50000,6400000,420976,53884945.437030,0.118772
h0r77ozVkEaFq9NntdbNXL,P0,50000,6400000,502502,64320317.108811,0.099502
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 h0r77ozVkEaFq9NntdbNXL S0 50000 6400000 420976 53884945.437030 0.118772
3 h0r77ozVkEaFq9NntdbNXL P0 50000 6400000 502502 64320317.108811 0.099502

View file

@ -0,0 +1,7 @@
=== core-1p1s-50k-128 ===
NATS Pub/Sub stats: 776,331 msgs/sec ~ 94.77 MB/sec
Pub stats: 502,502 msgs/sec ~ 61.34 MB/sec
Sub stats: 420,976 msgs/sec ~ 51.39 MB/sec
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,9 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
9lnpijWl8uftGl7cjgjfDG,S0,100000,12800000,338319,43304923.645655,0.295578
9lnpijWl8uftGl7cjgjfDG,S1,100000,12800000,328136,42001487.567998,0.304751
9lnpijWl8uftGl7cjgjfDG,S2,100000,12800000,319449,40889502.964037,0.313039
9lnpijWl8uftGl7cjgjfDG,S3,100000,12800000,269727,34525150.333968,0.370744
9lnpijWl8uftGl7cjgjfDG,P0,25000,3200000,184132,23569014.120587,0.135771
9lnpijWl8uftGl7cjgjfDG,P1,25000,3200000,183847,23532419.588601,0.135983
9lnpijWl8uftGl7cjgjfDG,P2,25000,3200000,100400,12851250.530089,0.249003
9lnpijWl8uftGl7cjgjfDG,P3,25000,3200000,95281,12196082.439191,0.262379
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 9lnpijWl8uftGl7cjgjfDG S0 100000 12800000 338319 43304923.645655 0.295578
3 9lnpijWl8uftGl7cjgjfDG S1 100000 12800000 328136 42001487.567998 0.304751
4 9lnpijWl8uftGl7cjgjfDG S2 100000 12800000 319449 40889502.964037 0.313039
5 9lnpijWl8uftGl7cjgjfDG S3 100000 12800000 269727 34525150.333968 0.370744
6 9lnpijWl8uftGl7cjgjfDG P0 25000 3200000 184132 23569014.120587 0.135771
7 9lnpijWl8uftGl7cjgjfDG P1 25000 3200000 183847 23532419.588601 0.135983
8 9lnpijWl8uftGl7cjgjfDG P2 25000 3200000 100400 12851250.530089 0.249003
9 9lnpijWl8uftGl7cjgjfDG P3 25000 3200000 95281 12196082.439191 0.262379

View file

@ -0,0 +1,17 @@
=== core-4p4s-100k-128 ===
NATS Pub/Sub stats: 1,278,454 msgs/sec ~ 156.06 MB/sec
Pub stats: 379,985 msgs/sec ~ 46.38 MB/sec
[1] 184,132 msgs/sec ~ 22.48 MB/sec (25000 msgs)
[2] 183,847 msgs/sec ~ 22.44 MB/sec (25000 msgs)
[3] 100,400 msgs/sec ~ 12.26 MB/sec (25000 msgs)
[4] 95,281 msgs/sec ~ 11.63 MB/sec (25000 msgs)
min 95,281 | avg 140,915 | max 184,132 | stddev 43,112 msgs
Sub stats: 1,078,910 msgs/sec ~ 131.70 MB/sec
[1] 338,319 msgs/sec ~ 41.30 MB/sec (100000 msgs)
[2] 328,136 msgs/sec ~ 40.06 MB/sec (100000 msgs)
[3] 319,449 msgs/sec ~ 39.00 MB/sec (100000 msgs)
[4] 269,727 msgs/sec ~ 32.93 MB/sec (100000 msgs)
min 269,727 | avg 313,907 | max 338,319 | stddev 26,367 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,9 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
TBolrRDh6R5ucnsIDRic4k,S0,50000,51200000,152508,156168868.728545,0.327850
TBolrRDh6R5ucnsIDRic4k,S1,50000,51200000,143666,147114019.174715,0.348029
TBolrRDh6R5ucnsIDRic4k,S2,50000,51200000,125714,128731399.676746,0.397727
TBolrRDh6R5ucnsIDRic4k,S3,50000,51200000,123195,126152033.863128,0.405859
TBolrRDh6R5ucnsIDRic4k,P0,12500,12800000,85005,87045293.746584,0.147050
TBolrRDh6R5ucnsIDRic4k,P1,12500,12800000,84991,87030908.333567,0.147074
TBolrRDh6R5ucnsIDRic4k,P2,12500,12800000,54739,56053364.168990,0.228354
TBolrRDh6R5ucnsIDRic4k,P3,12500,12800000,52467,53726394.065295,0.238244
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 TBolrRDh6R5ucnsIDRic4k S0 50000 51200000 152508 156168868.728545 0.327850
3 TBolrRDh6R5ucnsIDRic4k S1 50000 51200000 143666 147114019.174715 0.348029
4 TBolrRDh6R5ucnsIDRic4k S2 50000 51200000 125714 128731399.676746 0.397727
5 TBolrRDh6R5ucnsIDRic4k S3 50000 51200000 123195 126152033.863128 0.405859
6 TBolrRDh6R5ucnsIDRic4k P0 12500 12800000 85005 87045293.746584 0.147050
7 TBolrRDh6R5ucnsIDRic4k P1 12500 12800000 84991 87030908.333567 0.147074
8 TBolrRDh6R5ucnsIDRic4k P2 12500 12800000 54739 56053364.168990 0.228354
9 TBolrRDh6R5ucnsIDRic4k P3 12500 12800000 52467 53726394.065295 0.238244

View file

@ -0,0 +1,17 @@
=== core-4p4s-50k-1k ===
NATS Pub/Sub stats: 581,464 msgs/sec ~ 567.84 MB/sec
Pub stats: 209,545 msgs/sec ~ 204.63 MB/sec
[1] 85,005 msgs/sec ~ 83.01 MB/sec (12500 msgs)
[2] 84,991 msgs/sec ~ 83.00 MB/sec (12500 msgs)
[3] 54,739 msgs/sec ~ 53.46 MB/sec (12500 msgs)
[4] 52,467 msgs/sec ~ 51.24 MB/sec (12500 msgs)
min 52,467 | avg 69,300 | max 85,005 | stddev 15,718 msgs
Sub stats: 482,645 msgs/sec ~ 471.33 MB/sec
[1] 152,508 msgs/sec ~ 148.93 MB/sec (50000 msgs)
[2] 143,666 msgs/sec ~ 140.30 MB/sec (50000 msgs)
[3] 125,714 msgs/sec ~ 122.77 MB/sec (50000 msgs)
[4] 123,195 msgs/sec ~ 120.31 MB/sec (50000 msgs)
min 123,195 | avg 136,270 | max 152,508 | stddev 12,255 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,17 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
1wXmYbQfeZKgGIuRNRJWE9,S0,200000,25600000,294783,37732336.345174,0.678463
1wXmYbQfeZKgGIuRNRJWE9,S1,200000,25600000,285956,36602476.046553,0.699406
1wXmYbQfeZKgGIuRNRJWE9,S2,200000,25600000,270995,34687374.508938,0.738021
1wXmYbQfeZKgGIuRNRJWE9,S3,200000,25600000,268481,34365602.744388,0.744931
1wXmYbQfeZKgGIuRNRJWE9,S4,200000,25600000,242749,31071912.954289,0.823895
1wXmYbQfeZKgGIuRNRJWE9,S5,200000,25600000,243757,31200898.690210,0.820489
1wXmYbQfeZKgGIuRNRJWE9,S6,200000,25600000,232306,29735268.576473,0.860931
1wXmYbQfeZKgGIuRNRJWE9,S7,200000,25600000,231301,29606645.928715,0.864671
1wXmYbQfeZKgGIuRNRJWE9,P0,25000,3200000,161768,20706321.217329,0.154542
1wXmYbQfeZKgGIuRNRJWE9,P1,25000,3200000,156790,20069204.386621,0.159448
1wXmYbQfeZKgGIuRNRJWE9,P2,25000,3200000,101477,12989116.865479,0.246360
1wXmYbQfeZKgGIuRNRJWE9,P3,25000,3200000,96840,12395608.110541,0.258156
1wXmYbQfeZKgGIuRNRJWE9,P4,25000,3200000,48401,6195444.884723,0.516509
1wXmYbQfeZKgGIuRNRJWE9,P5,25000,3200000,56695,7256990.291363,0.440954
1wXmYbQfeZKgGIuRNRJWE9,P6,25000,3200000,42589,5451476.161959,0.586997
1wXmYbQfeZKgGIuRNRJWE9,P7,25000,3200000,41987,5374439.609281,0.595411
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 1wXmYbQfeZKgGIuRNRJWE9 S0 200000 25600000 294783 37732336.345174 0.678463
3 1wXmYbQfeZKgGIuRNRJWE9 S1 200000 25600000 285956 36602476.046553 0.699406
4 1wXmYbQfeZKgGIuRNRJWE9 S2 200000 25600000 270995 34687374.508938 0.738021
5 1wXmYbQfeZKgGIuRNRJWE9 S3 200000 25600000 268481 34365602.744388 0.744931
6 1wXmYbQfeZKgGIuRNRJWE9 S4 200000 25600000 242749 31071912.954289 0.823895
7 1wXmYbQfeZKgGIuRNRJWE9 S5 200000 25600000 243757 31200898.690210 0.820489
8 1wXmYbQfeZKgGIuRNRJWE9 S6 200000 25600000 232306 29735268.576473 0.860931
9 1wXmYbQfeZKgGIuRNRJWE9 S7 200000 25600000 231301 29606645.928715 0.864671
10 1wXmYbQfeZKgGIuRNRJWE9 P0 25000 3200000 161768 20706321.217329 0.154542
11 1wXmYbQfeZKgGIuRNRJWE9 P1 25000 3200000 156790 20069204.386621 0.159448
12 1wXmYbQfeZKgGIuRNRJWE9 P2 25000 3200000 101477 12989116.865479 0.246360
13 1wXmYbQfeZKgGIuRNRJWE9 P3 25000 3200000 96840 12395608.110541 0.258156
14 1wXmYbQfeZKgGIuRNRJWE9 P4 25000 3200000 48401 6195444.884723 0.516509
15 1wXmYbQfeZKgGIuRNRJWE9 P5 25000 3200000 56695 7256990.291363 0.440954
16 1wXmYbQfeZKgGIuRNRJWE9 P6 25000 3200000 42589 5451476.161959 0.586997
17 1wXmYbQfeZKgGIuRNRJWE9 P7 25000 3200000 41987 5374439.609281 0.595411

View file

@ -0,0 +1,25 @@
=== core-8p8s-200k-128 ===
NATS Pub/Sub stats: 2,065,217 msgs/sec ~ 252.10 MB/sec
Pub stats: 333,731 msgs/sec ~ 40.74 MB/sec
[1] 161,768 msgs/sec ~ 19.75 MB/sec (25000 msgs)
[2] 156,790 msgs/sec ~ 19.14 MB/sec (25000 msgs)
[3] 101,477 msgs/sec ~ 12.39 MB/sec (25000 msgs)
[4] 96,840 msgs/sec ~ 11.82 MB/sec (25000 msgs)
[5] 48,401 msgs/sec ~ 5.91 MB/sec (25000 msgs)
[6] 56,695 msgs/sec ~ 6.92 MB/sec (25000 msgs)
[7] 42,589 msgs/sec ~ 5.20 MB/sec (25000 msgs)
[8] 41,987 msgs/sec ~ 5.13 MB/sec (25000 msgs)
min 41,987 | avg 88,318 | max 161,768 | stddev 46,314 msgs
Sub stats: 1,847,242 msgs/sec ~ 225.49 MB/sec
[1] 294,783 msgs/sec ~ 35.98 MB/sec (200000 msgs)
[2] 285,956 msgs/sec ~ 34.91 MB/sec (200000 msgs)
[3] 270,995 msgs/sec ~ 33.08 MB/sec (200000 msgs)
[4] 268,481 msgs/sec ~ 32.77 MB/sec (200000 msgs)
[5] 242,749 msgs/sec ~ 29.63 MB/sec (200000 msgs)
[6] 243,757 msgs/sec ~ 29.76 MB/sec (200000 msgs)
[7] 232,306 msgs/sec ~ 28.36 MB/sec (200000 msgs)
[8] 231,301 msgs/sec ~ 28.24 MB/sec (200000 msgs)
min 231,301 | avg 258,791 | max 294,783 | stddev 22,958 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,86 @@
execution_host=NS1.GEORGELAMBERT.ORG
execution_ip=70.88.205.138
hostname=NS1.GEORGELAMBERT.ORG
utc=2026-09-12T05:14:00Z
whoami=marchon
pwd=/home/marchon/verae-src/verae-nats-cluster
uname=Linux NS1.GEORGELAMBERT.ORG 6.17.2-1-pve #1 SMP PREEMPT_DYNAMIC PMX 6.17.2-1 (2025-10-21T11:55Z) x86_64 GNU/Linux
nproc=40
loadavg=8.67 8.33 8.15 9/3863 4114865
client_vmid=510
nats_url=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
--- free ---
total used free shared buff/cache available
Mem: 377Gi 38Gi 324Gi 4.3Gi 21Gi 339Gi
Swap: 8.0Gi 0B 8.0Gi
--- pct list ---
VMID Status Lock Name
100 stopped CT100
101 stopped CT101
102 stopped CT102
103 stopped CT103
104 stopped CT104
105 stopped CT105
106 stopped CT106
107 stopped CT107
108 stopped CT108
109 stopped CT109
110 stopped CT110
111 stopped CT111
112 stopped CT112
113 stopped CT113
114 stopped CT114
115 stopped CT115
116 stopped paul
117 stopped CT117
118 stopped CT118
119 stopped CT119
120 stopped rustdeskserver
121 stopped CT121
122 stopped CT122
123 stopped CT123
124 stopped bdross
200 stopped CT200
201 stopped CT201
202 stopped CT202
300 running mail.veraetime.info
400 stopped evercycle-api
501 running pki
502 running peergos-a
503 running peergos-b
504 stopped minio
510 running verae-px-worker
511 running nats-a
512 running nats-b
513 running nats-c
2000 stopped CT2000
2001 stopped CT2001
2002 stopped CT2002
--- pct config 510 ---
cores: 2
hostname: verae-px-worker
memory: 2048
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:BD:5D:62,ip=10.10.10.20/24,type=veth
rootfs: SSD2:subvol-510-disk-0,size=16G
swap: 512
--- pct config 511 ---
cores: 1
hostname: nats-a
memory: 1024
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:CF:AC:68,ip=10.10.10.21/24,type=veth
rootfs: SSD2:subvol-511-disk-0,size=8G
swap: 256
--- pct config 512 ---
cores: 1
hostname: nats-b
memory: 1024
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:42:73:A2,ip=10.10.10.22/24,type=veth
rootfs: SSD2:subvol-512-disk-0,size=8G
swap: 256
--- pct config 513 ---
cores: 1
hostname: nats-c
memory: 1024
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:1B:9B:DC,ip=10.10.10.23/24,type=veth
rootfs: SSD2:subvol-513-disk-0,size=8G
swap: 256

View file

@ -0,0 +1,86 @@
execution_host=NS1.GEORGELAMBERT.ORG
execution_ip=70.88.205.138
hostname=NS1.GEORGELAMBERT.ORG
utc=2026-09-12T05:12:37Z
whoami=marchon
pwd=/home/marchon/verae-src/verae-nats-cluster
uname=Linux NS1.GEORGELAMBERT.ORG 6.17.2-1-pve #1 SMP PREEMPT_DYNAMIC PMX 6.17.2-1 (2025-10-21T11:55Z) x86_64 GNU/Linux
nproc=40
loadavg=8.59 8.39 8.15 5/3843 4096277
client_vmid=510
nats_url=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
--- free ---
total used free shared buff/cache available
Mem: 377Gi 38Gi 324Gi 4.2Gi 21Gi 339Gi
Swap: 8.0Gi 0B 8.0Gi
--- pct list ---
VMID Status Lock Name
100 stopped CT100
101 stopped CT101
102 stopped CT102
103 stopped CT103
104 stopped CT104
105 stopped CT105
106 stopped CT106
107 stopped CT107
108 stopped CT108
109 stopped CT109
110 stopped CT110
111 stopped CT111
112 stopped CT112
113 stopped CT113
114 stopped CT114
115 stopped CT115
116 stopped paul
117 stopped CT117
118 stopped CT118
119 stopped CT119
120 stopped rustdeskserver
121 stopped CT121
122 stopped CT122
123 stopped CT123
124 stopped bdross
200 stopped CT200
201 stopped CT201
202 stopped CT202
300 running mail.veraetime.info
400 stopped evercycle-api
501 running pki
502 running peergos-a
503 running peergos-b
504 stopped minio
510 running verae-px-worker
511 running nats-a
512 running nats-b
513 running nats-c
2000 stopped CT2000
2001 stopped CT2001
2002 stopped CT2002
--- pct config 510 ---
cores: 2
hostname: verae-px-worker
memory: 2048
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:BD:5D:62,ip=10.10.10.20/24,type=veth
rootfs: SSD2:subvol-510-disk-0,size=16G
swap: 512
--- pct config 511 ---
cores: 1
hostname: nats-a
memory: 1024
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:CF:AC:68,ip=10.10.10.21/24,type=veth
rootfs: SSD2:subvol-511-disk-0,size=8G
swap: 256
--- pct config 512 ---
cores: 1
hostname: nats-b
memory: 1024
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:42:73:A2,ip=10.10.10.22/24,type=veth
rootfs: SSD2:subvol-512-disk-0,size=8G
swap: 256
--- pct config 513 ---
cores: 1
hostname: nats-c
memory: 1024
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:1B:9B:DC,ip=10.10.10.23/24,type=veth
rootfs: SSD2:subvol-513-disk-0,size=8G
swap: 256

View file

@ -0,0 +1,2 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
8rEl4zHbyuPY6Hq62w9Qsw,P0,40000,2560000,7393,946342.174329,2.705153
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 8rEl4zHbyuPY6Hq62w9Qsw P0 40000 2560000 7393 946342.174329 2.705153

View file

@ -0,0 +1,5 @@
=== js-1p-20k-128-r3 ===
Pub stats: 7,393 msgs/sec ~ 924.16 KB/sec
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
VI7cqfC8hjqPoKek3p2a06,S0,20150,1280000,4248,543810.859674,2.353760
VI7cqfC8hjqPoKek3p2a06,S1,20159,1280000,3858,493875.492651,2.591746
VI7cqfC8hjqPoKek3p2a06,P0,20000,1280000,11290,1445228.034916,0.885673
VI7cqfC8hjqPoKek3p2a06,P1,20000,1280000,3864,494600.778891,2.587946
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 VI7cqfC8hjqPoKek3p2a06 S0 20150 1280000 4248 543810.859674 2.353760
3 VI7cqfC8hjqPoKek3p2a06 S1 20159 1280000 3858 493875.492651 2.591746
4 VI7cqfC8hjqPoKek3p2a06 P0 20000 1280000 11290 1445228.034916 0.885673
5 VI7cqfC8hjqPoKek3p2a06 P1 20000 1280000 3864 494600.778891 2.587946

View file

@ -0,0 +1,13 @@
=== js-2p2s-20k-128-r3 ===
NATS Pub/Sub stats: 15,416 msgs/sec ~ 1.88 MB/sec
Pub stats: 7,728 msgs/sec ~ 966.02 KB/sec
[1] 11,290 msgs/sec ~ 1.38 MB/sec (10000 msgs)
[2] 3,864 msgs/sec ~ 483.01 KB/sec (10000 msgs)
min 3,864 | avg 7,577 | max 11,290 | stddev 3,713 msgs
Sub stats: 7,711 msgs/sec ~ 963.88 KB/sec
[1] 4,248 msgs/sec ~ 531.07 KB/sec (10000 msgs)
[2] 3,858 msgs/sec ~ 482.30 KB/sec (10000 msgs)
min 3,858 | avg 4,053 | max 4,248 | stddev 195 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
InppzTmEhsFOG1VYCh0Nle,P0,10000,5120000,4792,4907526.298214,1.043295
InppzTmEhsFOG1VYCh0Nle,P1,10000,5120000,4480,4587592.638694,1.116054
InppzTmEhsFOG1VYCh0Nle,P2,10000,5120000,3792,3883639.365215,1.318351
InppzTmEhsFOG1VYCh0Nle,P3,10000,5120000,3750,3840425.475938,1.333186
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 InppzTmEhsFOG1VYCh0Nle P0 10000 5120000 4792 4907526.298214 1.043295
3 InppzTmEhsFOG1VYCh0Nle P1 10000 5120000 4480 4587592.638694 1.116054
4 InppzTmEhsFOG1VYCh0Nle P2 10000 5120000 3792 3883639.365215 1.318351
5 InppzTmEhsFOG1VYCh0Nle P3 10000 5120000 3750 3840425.475938 1.333186

View file

@ -0,0 +1,10 @@
=== js-4p-20k-1k-r3 ===
Pub stats: 14,985 msgs/sec ~ 14.63 MB/sec
[1] 4,792 msgs/sec ~ 4.68 MB/sec (5000 msgs)
[2] 4,480 msgs/sec ~ 4.38 MB/sec (5000 msgs)
[3] 3,792 msgs/sec ~ 3.70 MB/sec (5000 msgs)
[4] 3,750 msgs/sec ~ 3.66 MB/sec (5000 msgs)
min 3,750 | avg 4,203 | max 4,792 | stddev 446 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
JeTysfxECHCJccBaGH4xXX,P0,25000,1600000,5640,721943.982931,2.216238
JeTysfxECHCJccBaGH4xXX,P1,25000,1600000,5642,722187.413742,2.215491
JeTysfxECHCJccBaGH4xXX,P2,25000,1600000,5056,647242.012627,2.472027
JeTysfxECHCJccBaGH4xXX,P3,25000,1600000,4497,575730.101666,2.779080
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 JeTysfxECHCJccBaGH4xXX P0 25000 1600000 5640 721943.982931 2.216238
3 JeTysfxECHCJccBaGH4xXX P1 25000 1600000 5642 722187.413742 2.215491
4 JeTysfxECHCJccBaGH4xXX P2 25000 1600000 5056 647242.012627 2.472027
5 JeTysfxECHCJccBaGH4xXX P3 25000 1600000 4497 575730.101666 2.779080

View file

@ -0,0 +1,10 @@
=== js-4p-50k-128-r3 ===
Pub stats: 17,986 msgs/sec ~ 2.20 MB/sec
[1] 5,640 msgs/sec ~ 705.02 KB/sec (12500 msgs)
[2] 5,642 msgs/sec ~ 705.26 KB/sec (12500 msgs)
[3] 5,056 msgs/sec ~ 632.07 KB/sec (12500 msgs)
[4] 4,497 msgs/sec ~ 562.24 KB/sec (12500 msgs)
min 4,497 | avg 5,208 | max 5,642 | stddev 475 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,2 @@
=== lat-1p-5k-128 ===
{"count":5000,"pubs":1,"size":128,"mode":"flood","min_us":132425,"avg_us":203717,"p50_us":204458,"p90_us":241750,"p99_us":249468,"max_us":249640,"min":"132.425ms","avg":"203.717ms","p50":"204.458ms","p90":"241.750ms","p99":"249.468ms","max":"249.640ms"}

View file

@ -0,0 +1,2 @@
=== lat-4p-10k-128 ===
{"count":10000,"pubs":4,"size":128,"mode":"flood","min_us":211108,"avg_us":294925,"p50_us":300254,"p90_us":314223,"p99_us":315551,"max_us":316091,"min":"211.108ms","avg":"294.925ms","p50":"300.254ms","p90":"314.223ms","p99":"315.551ms","max":"316.091ms"}

View file

@ -0,0 +1,2 @@
=== lat-4p-5k-1k ===
{"count":5000,"pubs":4,"size":1024,"mode":"flood","min_us":196422,"avg_us":221264,"p50_us":224039,"p90_us":233180,"p99_us":236798,"max_us":238177,"min":"196.422ms","avg":"221.264ms","p50":"224.039ms","p90":"233.180ms","p99":"236.798ms","max":"238.177ms"}

View file

@ -0,0 +1,2 @@
=== lat-8p-20k-128 ===
{"count":20000,"pubs":8,"size":128,"mode":"flood","min_us":280608,"avg_us":414972,"p50_us":409802,"p90_us":513821,"p99_us":535394,"max_us":536084,"min":"280.608ms","avg":"414.972ms","p50":"409.802ms","p90":"513.821ms","p99":"535.394ms","max":"536.084ms"}

View file

@ -0,0 +1,2 @@
=== lat-ping-1k-128 ===
{"count":1000,"pubs":1,"size":128,"mode":"ping","min_us":341,"avg_us":470,"p50_us":395,"p90_us":651,"p99_us":1377,"max_us":3243,"min":"0.341ms","avg":"0.470ms","p50":"0.395ms","p90":"0.651ms","p99":"1.377ms","max":"3.243ms"}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,334 @@
**Progress report (second study)** · run `20260912T051237Z` (UTC)
> **Execution provenance.** Every process for this study ran on **NS1.GEORGELAMBERT.ORG** (`70.88.205.138`): the orchestrator (`study-on-ns1.sh`), `nats bench`, `latency.mjs` (inside LXC 510 on this hypervisor), charting (`matplotlib`), and HTML/PDF (`pandoc` + `weasyprint`). The operator laptop did **not** publish, subscribe, draw charts, or render the PDF. Traffic stayed on `vmbr1` from LXC **510** to `nats-a/b/c` (**511513**).
This is a full methodology write-up plus the numbers from that on-host run. The earlier report (`nats-cluster-bench`, run `20260912T045131Z`) used the same cluster but was **orchestrated and rendered off-box**. Use this document when you need “it was all run on 138.”
---
## 1. Executive summary
| Item | This NS1-host run |
|------|-------------------|
| Control plane | NS1.GEORGELAMBERT.ORG (`70.88.205.138`), user `marchon` |
| Bench client | LXC 510 `verae-px-worker` |
| Brokers | LXC 511/512/513 `nats-a/b/c` on `10.10.10.2123` |
| Client URL | `nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222` |
| Host load before | `8.59 8.39 8.15 5/3843 4096277` |
| Host load after | `8.67 8.33 8.15 9/3863 4114865` |
| Core 1p1s 128 B pub | 502,502 msgs/s |
| JetStream 1p 128 B r=3 | 7,393 durable pubs/s |
| Ping p50 / p99 | 0.395ms / 1.377ms |
Product traffic is the JetStream row. Ping is one-message delay. Flood is mailbox catch-up after a burst.
---
## 2. Where it ran (and where it did not)
```text
Operator laptop ──ssh──► NS1.GEORGELAMBERT.ORG 70.88.205.138
study-on-ns1.sh
python3 build-ns1-study-report.py
sudo pct exec 510 ──► nats bench / latency.mjs
▼ vmbr1
10.10.10.21-23 :4222
```
- **Did run on 138:** bash, python3, matplotlib, pandoc, weasyprint, `pct`, nats-server (in LXC), nats CLI and Node (in LXC 510).
- **Did not run on the laptop:** no local `nats bench`, no local charting, no local WeasyPrint for this file.
---
## 3. Results (this run)
### Host and brokers
**Before**
| Node | VMID | connections | in_msgs | out_msgs | cpu | cores | mem (B) | jetstream |
|------|------|-------------|---------|----------|-----|-------|---------|-----------|
| nats-a | 511 | 2 | 1,721,203 | 4,933,759 | 1 | 1 | 26,398,720 | True |
| nats-b | 512 | 2 | 1,613,205 | 3,513,096 | 0 | 1 | 23,097,344 | True |
| nats-c | 513 | 2 | 1,760,973 | 4,048,582 | 2 | 1 | 23,867,392 | True |
**After**
| Node | VMID | connections | in_msgs | out_msgs | cpu | cores | mem (B) | jetstream |
|------|------|-------------|---------|----------|-----|-------|---------|-----------|
| nats-a | 511 | 2 | 2,097,596 | 5,910,161 | 1 | 1 | 38,273,024 | True |
| nats-b | 512 | 2 | 2,121,816 | 4,746,539 | 1 | 1 | 41,361,408 | True |
| nats-c | 513 | 2 | 2,241,366 | 5,053,978 | 1 | 1 | 38,162,432 | True |
nproc=40 · uname=`Linux NS1.GEORGELAMBERT.ORG 6.17.2-1-pve #1 SMP PREEMPT_DYNAMIC PMX 6.17.2-1 (2025-10-21T11:55Z) x86_64 GNU/Linux`
### Throughput
| Run | Mode | Aggregate msgs/s | Pub msgs/s | Pub MB/s | Sub msgs/s | Sub MB/s |
|-----|------|------------------|------------|----------|------------|----------|
| `core-1p1s-50k-128` | core pub/sub | 776,331 | 502,502 | 61.34 | 420,976 | 51.39 |
| `core-4p4s-100k-128` | core pub/sub | 1,278,454 | 379,985 | 46.38 | 1,078,910 | 131.70 |
| `core-4p4s-50k-1k` | core pub/sub | 581,464 | 209,545 | 204.63 | 482,645 | 471.33 |
| `core-8p8s-200k-128` | core pub/sub | 2,065,217 | 333,731 | 40.74 | 1,847,242 | 225.49 |
| `js-1p-20k-128-r3` | jetstream r=3 file | — | 7,393 | 0.90 | — | — |
| `js-2p2s-20k-128-r3` | jetstream r=3 file | 15,416 | 7,728 | 0.94 | 7,711 | 0.94 |
| `js-4p-20k-1k-r3` | jetstream r=3 file | — | 14,985 | 14.63 | — | — |
| `js-4p-50k-128-r3` | jetstream r=3 file | — | 17,986 | 2.20 | — | — |
### Round-trip delay
| Run | Kind | Count | Pubs | Size | min | avg | p50 | p90 | p99 | max |
|-----|------|-------|------|------|-----|-----|-----|-----|-----|-----|
| `lat-ping-1k-128` | ping (sequential RTT) | 1000 | 1 | 128 B | 0.341ms | 0.470ms | 0.395ms | 0.651ms | 1.377ms | 3.243ms |
| `lat-1p-5k-128` | flood (burst queueing) | 5000 | 1 | 128 B | 132.425ms | 203.717ms | 204.458ms | 241.750ms | 249.468ms | 249.640ms |
| `lat-4p-5k-1k` | flood (burst queueing) | 5000 | 4 | 1024 B | 196.422ms | 221.264ms | 224.039ms | 233.180ms | 236.798ms | 238.177ms |
| `lat-4p-10k-128` | flood (burst queueing) | 10000 | 4 | 128 B | 211.108ms | 294.925ms | 300.254ms | 314.223ms | 315.551ms | 316.091ms |
| `lat-8p-20k-128` | flood (burst queueing) | 20000 | 8 | 128 B | 280.608ms | 414.972ms | 409.802ms | 513.821ms | 535.394ms | 536.084ms |
### Core NATS
![Core NATS throughput at four loads (NS1 host run)](charts/core-throughput.png)
*Core NATS throughput at four loads (NS1 host run)*
### Payload size (core)
![Core NATS 128 B vs 1 KiB (NS1 host run)](charts/payload-size.png)
*Core NATS 128 B vs 1 KiB (NS1 host run)*
### JetStream r=3 file
![JetStream durable publish rate (NS1 host run)](charts/js-throughput.png)
*JetStream durable publish rate (NS1 host run)*
### Core vs JetStream
![Core vs JetStream publish rate, log scale (NS1 host run)](charts/core-vs-js.png)
*Core vs JetStream publish rate, log scale (NS1 host run)*
### Delay
![Ping vs flood delay percentiles, log scale (NS1 host run)](charts/delay-percentiles.png)
*Ping vs flood delay percentiles, log scale (NS1 host run)*
---
## 4. Study methodology
### 4.1 Question
On the NS1 test stand, what message **throughput** and **delay** does the three-node `verae` JetStream cluster deliver at several loads, and which part of the stack is the limiter for product traffic (jobs, events, webhooks, archive)?
### 4.2 Hypotheses (stated before the run)
1. **H1 — Core vs JetStream.** Fire-and-forget core NATS is at least an order of magnitude faster than JetStream **file + replicas=3**, because durable publish waits for a majority disk replica.
2. **H2 — JetStream parallelism.** Adding publishers does **not** linearly increase JetStream write rate once the replica log is saturated.
3. **H3 — Quiet delay.** Sequential pub→sub round trip on `vmbr1` is well under 1 ms p99 when the consumer is waiting.
4. **H4 — Burst delay.** If publishers dump a batch before the subscriber drains, observed delay is **queueing time**, roughly linear in backlog, not in cluster hop count.
5. **H5 — Payload.** Moving 128 B → 1 KiB lowers message rate and raises byte rate on core NATS; JetStream in this size band stays replica/fsync bound.
### 4.3 Independent variables (what we changed)
| Factor | Levels |
|--------|--------|
| Transport | Core NATS pub/sub vs JetStream file replicas=3 |
| Publisher count | 1, 2, 4, 8 |
| Subscriber count | 0 (JS publish-only), 1, 2, 4, 8 |
| Message count | 1k, 5k, 10k, 20k, 50k, 100k, 200k (by ladder step) |
| Payload | 128 B, 1024 B |
| Delay mode | **ping** (publish, wait, repeat) vs **flood** (publish all, then drain) |
### 4.4 Dependent variables (what we recorded)
| Metric | Instrument | Unit |
|--------|------------|------|
| Publish rate | `nats bench` 0.1.6 Pub stats | msgs/s, MB/s |
| Subscribe rate | `nats bench` Sub stats | msgs/s, MB/s |
| Aggregate | `nats bench` NATS Pub/Sub stats | msgs/s (fan-out counts both sides) |
| Publisher spread | nats min/avg/max **msgs/s** | not delay |
| One-way-ish RTT | `latency.mjs` header timestamp | min, avg, p50, p90, p99, max |
| Host load | `/proc/loadavg` before and after | load average |
| Broker counters | `http://127.0.0.1:8222/varz` inside each nats LXC | connections, in/out msgs, cpu, mem |
**Important:** nats CLI 0.1.6 min/avg/max are **rate spread across publishers**, not microseconds of delay. Delay is only `latency.mjs`.
### 4.5 Controls and constants
- Cluster name `verae`, three routes, client `:4222`, cluster `:6222`, monitor loopback `:8222`.
- Client URL always the three-node list on `vmbr1` (never host `127.0.0.1:4222`, never `vmbr0`).
- Bench client is LXC **510**, not a nats-* server.
- JetStream bench stream name `benchstream`, **file** storage, **replicas=3**, deleted between JS loads (`nats stream rm --force`) so names do not collide.
- Product streams were **not** the bench target (no load test on `ZAPIER_*` / `VERAE_ARCHIVE`).
- No TLS, no nkeys, no account isolation (isolation is `vmbr1`).
- Same nats CLI version (0.1.6) and `nats@2` Node client as the first ladder.
### 4.6 Procedure
1. Confirm this script is executing on **NS1.GEORGELAMBERT.ORG**. Refuse otherwise.
2. Snapshot host load, memory, LXC configs, and each nats `varz`.
3. From NS1, `pct exec 510` the core ladder (1p1s, 4p4s, 8p8s at 128 B; 4p4s at 1 KiB).
4. Delete `benchstream`; JS ladder (1p, 4p, 4p×1 KiB, 2p2s pull) at replicas=3 file.
5. Copy `latency.mjs` into 510; ping then flood at several batch sizes.
6. Snapshot host/`varz` again.
7. Parse logs on **this host**; draw charts; write HTML and PDF on **this host**.
No publish, subscribe, chart, or PDF process runs on the operator laptop for this study.
### 4.7 Instrumentation path
```text
[NS1 host 70.88.205.138]
study-on-ns1.sh (bash + python3)
|
| sudo pct exec 510
v
[LXC 510 verae-px-worker 10.10.10.20]
nats bench / node latency.mjs
|
| NATS client protocol to
v
[LXC 511/512/513 10.10.10.21-23 :4222]
nats-server -js cluster routes :6222
```
The hypervisor issues the guest commands. The messages themselves never leave `vmbr1`.
### 4.8 Threats to validity
| Threat | Effect on numbers |
|--------|-------------------|
| **One physical host** | Three “replicas” share CPU, memory, and usually the same datastore. This measures process/LXC HA, not disk HA. |
| **Shared load** | NS1 also runs Caddy, Forgejo, keep, fleet, portal, and other CTs. Load average during a run is part of the result, not noise to ignore. |
| **Single bench client** | All publishers live in 510. Per-publisher rate spread is contention in that guest. |
| **Short runs** | Seconds of traffic. No compaction, no multi-hour page-cache eviction, no snapshot during load. |
| **No TLS/nkeys** | Production auth will cost CPU. Do not treat these rates as post-nkeys rates. |
| **Fan-out aggregate** | Core aggregate msgs/s counts pub+sub. Do not compare that column to JetStream unique writes. |
| **Flood ≠ RTT** | Mixing flood averages with ping p99 produces a fake “NATS is slow” story. |
| **Lab only** | Not a Zapier HTTPS bench and not live `api.veraetime.net`. |
### 4.9 Ethics / safety
Bench uses throwaway subjects (`bench.core.*`, `bench.js.*`, `bench.lat.*`) and a throwaway stream. It does not purge product streams. Zapier cloud has no NATS socket.
---
## 5. Suggestions for fine-tuning
These follow from the method and from the first ladder on this stand (JetStream ~16k durable 128 B pubs/s; ping ~0.3 ms; flood hundreds of ms). Apply in order of leverage. Re-run **this NS1 study** after each change so the delta is measured the same way.
### 5.1 Treat JetStream as the product limiter
Product jobs/events/webhooks/archive are durable. Tuning core NATS to 2M msgs/s will not move a timestamp Zap. Put effort into **replica write path** and **consumer lag**, not core fan-out.
### 5.2 Split storage class by stream
| Stream | Suggested store | Why |
|--------|-----------------|-----|
| `ZAPIER_JOBS` | file, r=3 | Work queue; lose-a-job is bad |
| `ZAPIER_EVENTS` | file r=3, or memory r=3 if events are rebuildable from job status | Hot waiters; measure both |
| `ZAPIER_WEBHOOKS` | file, r=3, workqueue | HTTPS to Zapier is the slow consumer |
| `ZAPIER_USAGE` | file, r=3, limits + max-age | Telemetry |
| `VERAE_ARCHIVE` | file, r=3, on the **best disk** | Puts are larger and must survive |
Try `ZAPIER_EVENTS` as memory store in a maintenance window and re-run only the JS + ping/flood steps. If ping stays ~0.3 ms and durable events still ack at a higher rate, keep it; if a CT restart drops in-flight waiters, revert.
### 5.3 Give JetStream real disks
Today r=3 on three LXC guests on **one Proxmox host** is three files, one failure domain.
- Bind-mount a distinct SSD/NVMe (or ZFS dataset with its own vdev) into each nats LXC `store_dir`.
- Set `sync: always` only on archive if you need it; default sync is often enough for jobs and is faster. Measure.
- Do not put JetStream `store_dir` on the same busy rootfs as Forgejo/Caddy if we can avoid it.
- When moving to three metal boxes: same configs, private NIC, one disk (or mirror) **per node**. That is the first change that makes r=3 mean “two boxes can die.”
### 5.4 Isolate the nats CTs from the rest of NS1
Host load on this box is often already several. Pin:
- `nats-a/b/c`: dedicated cores, no steal from keep/fleet Node processes.
- Memory high enough that file-backed streams stay cache-hot for the working set.
- `cpuunits` / cpuset in `pct config` so a Zapier-facing Node GC pause does not stall fsync.
Re-run this study after pinning; H1/H2 should move more than ping.
### 5.5 Consumer and mailbox tuning (delay H4)
Flood delay is backlog / consume_rate. Fine-tune the **waiters**, not the broker RTT.
- `jobs.events` and `webhooks.deliver`: raise `max_ack_pending` so a slow HTTPS hook does not stall the whole consumer; cap it so a poison message cannot unbounded-buffer RAM.
- Pull consumers: larger batch, shorter `expires`, more pullers horizontally (fleet replica floors) instead of one fat subscriber.
- Middleware should **not** flood-publish then wait; it already does per-job publish. Keep that. The flood test is the outage profile when a consumer is stopped.
- Alert on **consumer lag** (pending + ack pending) from JetStream, not on ping RTT.
### 5.6 Publisher-side batching in middleware
A timestamp job is one small JSON. 16k msgs/s is ample. Still:
- Avoid per-byte publishes; one message per job/event.
- Reuse NATS connections (connection churn showed up as publisher spread in the core 4p/8p runs).
- Idempotent `msg id` / duplicate window sized to Verae retry window, not default-only.
### 5.7 nats-server knobs worth measuring (A/B with this script)
| Knob | Why try it |
|------|------------|
| `max_payload` | Keep default unless archive puts grow |
| `write_deadline` | Slow consumer protection for webhooks |
| `max_pending` | Bound memory on a stuck Zapier hook |
| `max_connections` | Fleet workers + keep + middleware |
| JetStream `max_file_store` / `max_memory_store` | Prevent one stream from filling the CT |
| `max_outstanding_catchup` | Replica restart after a nats-c blip |
| GOMAXPROCS = LXC cores | Do not overthread a 2-core CT |
Change **one** knob, re-run `study-on-ns1.sh`, compare JetStream 1p 128 B and ping p99.
### 5.8 Network
- Keep NATS off `vmbr0`. No change.
- When on metal: dedicated NIC or VLAN for cluster `:6222` vs client `:4222` if possible (replication vs client load).
- Check virtio queue counts on the LXC nics if core 1 KiB byte rate plateaus.
### 5.9 Security cost (when nkeys/mTLS flip)
`verae-nats-accounts` is still a sketch. Enabling accounts will add CPU on publish. Budget: re-run this exact study **after** creds are in every `NATS_URL`, and accept a drop on both core and JS. Do not flip without that measurement.
### 5.10 Operational fine-tuning (lag, not peak msgs/s)
1. Scrape `varz` / `jsz` from the host over `vmbr1` (not public). Monitor loopback `:8222` is invisible to Prometheus on NS1 unless we add a host-side proxy on `10.10.10.21:8222` bound only to `vmbr1`.
2. Keep replica floors for webhook-deliver and job-poller — they are the flood defense.
3. Backup/restore drill of JetStream **during idle**, then a short JS 1p run to see catchup cost.
4. A 1530 minute soak (not in this ladder) for page cache and compaction; add that as a third study when disks are dedicated.
### 5.11 What not to tune
- Do not chase core 8p8s aggregate. It is fan-out on a lab bridge.
- Do not treat flood 400 ms as “cluster RTT.” Fix consumers.
- Do not load-test on `ZAPIER_*` streams.
- Do not bind client NATS to `0.0.0.0` on `vmbr0`.
### 5.12 Recommended next experiments (same method, one change each)
1. CPU pin nats-a/b/c → re-run JS 1p + ping.
2. `ZAPIER_EVENTS`-shaped memory stream vs file (throwaway stream, same flags as this JS ladder).
3. Distinct `store_dir` disks per node.
4. nkeys on, same ladder.
5. Three hardware boxes, same `cluster.env` IPs updated.
Each experiment should produce a new `results/<utc>/` on NS1 and a new progress-repo report so we can diff H1H5 instead of arguing from memory.
---
## 6. Reproducing this study
On **NS1 only**:
```bash
cd ~/verae-src/verae-nats-cluster
bash scripts/study-on-ns1.sh
```
The script exits if `hostname` is not NS1. Outputs land in `results/<utc>/` including `nats-cluster-bench-ns1.{md,html,pdf}` and `charts/`. Copy those into `zapier-decisions/reports/` for the progress repo and catalog.
Raw logs for this run: `results/20260912T051237Z/`.

Binary file not shown.

View file

@ -0,0 +1,50 @@
[
{
"vmid": "511",
"name": "nats-a",
"server_name": "nats-a",
"host": "10.10.10.21",
"port": 4222,
"connections": 2,
"in_msgs": 2097596,
"out_msgs": 5910161,
"in_bytes": 559427613,
"out_bytes": 1494241553,
"cpu": 1,
"cores": 1,
"mem": 38273024,
"jetstream": true
},
{
"vmid": "512",
"name": "nats-b",
"server_name": "nats-b",
"host": "10.10.10.22",
"port": 4222,
"connections": 2,
"in_msgs": 2121816,
"out_msgs": 4746539,
"in_bytes": 585390797,
"out_bytes": 974695990,
"cpu": 1,
"cores": 1,
"mem": 41361408,
"jetstream": true
},
{
"vmid": "513",
"name": "nats-c",
"server_name": "nats-c",
"host": "10.10.10.23",
"port": 4222,
"connections": 2,
"in_msgs": 2241366,
"out_msgs": 5053978,
"in_bytes": 586858467,
"out_bytes": 1040486148,
"cpu": 1,
"cores": 1,
"mem": 38162432,
"jetstream": true
}
]

View file

@ -0,0 +1,50 @@
[
{
"vmid": "511",
"name": "nats-a",
"server_name": "nats-a",
"host": "10.10.10.21",
"port": 4222,
"connections": 2,
"in_msgs": 1721203,
"out_msgs": 4933759,
"in_bytes": 440427700,
"out_bytes": 1169323990,
"cpu": 1,
"cores": 1,
"mem": 26398720,
"jetstream": true
},
{
"vmid": "512",
"name": "nats-b",
"server_name": "nats-b",
"host": "10.10.10.22",
"port": 4222,
"connections": 2,
"in_msgs": 1613205,
"out_msgs": 3513096,
"in_bytes": 428640182,
"out_bytes": 715428083,
"cpu": 0,
"cores": 1,
"mem": 23097344,
"jetstream": true
},
{
"vmid": "513",
"name": "nats-c",
"server_name": "nats-c",
"host": "10.10.10.23",
"port": 4222,
"connections": 2,
"in_msgs": 1760973,
"out_msgs": 4048582,
"in_bytes": 447844308,
"out_bytes": 864199465,
"cpu": 2,
"cores": 1,
"mem": 23867392,
"jetstream": true
}
]

View file

@ -0,0 +1,52 @@
# NATS cluster message speed
Run **`20260912T053120Z`** (UTC). Client: LXC **510** `verae-px-worker` (`10.10.10.20`), not a nats-* server. Servers: `nats-a/b/c` on `10.10.10.2123` (`vmbr1` only).
Client URL:
```text
nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
```
## Method
- **Core NATS** is fire-and-forget pub/sub (`nats bench`). No disk, no replica ack.
- **JetStream** uses **file** storage and **replicas=3** (same as product streams). The unique stream `benchstream` is deleted between JS loads.
- Throughput is **msgs/sec** from nats CLI **0.1.6** (`--no-progress --csv`). Its min/avg/max are publisher **rate spread**, not delay.
- **Ping** delay: one publisher, sequential publish-then-wait. This is one-message round-trip through the cluster.
- **Flood** delay: N publishers dump the whole batch, then the subscriber drains. This is **queueing under burst**, not wire RTT.
- Probe: `scripts/latency.mjs` (two connections, header timestamp).
## Throughput
| Run | Mode | Aggregate msgs/s | Pub msgs/s | Pub MB/s | Sub msgs/s | Sub MB/s |
|-----|------|------------------|------------|----------|------------|----------|
| `core-1p1s-50k-128` | core pub/sub | 810,988 | 599,004 | 73.12 | 456,116 | 55.68 |
| `core-4p4s-100k-128` | core pub/sub | 1,361,921 | 379,346 | 46.31 | 1,150,536 | 140.45 |
| `core-4p4s-50k-1k` | core pub/sub | 695,192 | 175,725 | 171.61 | 584,024 | 570.34 |
| `core-8p8s-200k-128` | core pub/sub | 1,998,733 | 283,259 | 34.58 | 1,780,589 | 217.36 |
| `js-1p-20k-128-r3` | jetstream r=3 file | — | 17,388 | 2.12 | — | — |
| `js-2p2s-20k-128-r3` | jetstream r=3 file | 19,876 | 9,959 | 1.22 | 9,942 | 1.21 |
| `js-4p-20k-1k-r3` | jetstream r=3 file | — | 18,114 | 17.69 | — | — |
| `js-4p-50k-128-r3` | jetstream r=3 file | — | 22,853 | 2.79 | — | — |
| `js-mem-1p-20k-128-r3` | jetstream r=3 file | — | 22,153 | 2.70 | — | — |
| `js-mem-4p-20k-1k-r3` | jetstream r=3 file | — | 28,685 | 28.01 | — | — |
| `js-mem-4p-50k-128-r3` | jetstream r=3 file | — | 36,355 | 4.44 | — | — |
## Round-trip delay
| Run | Kind | Count | Pubs | Size | min | avg | p50 | p90 | p99 | max |
|-----|------|-------|------|------|-----|-----|-----|-----|-----|-----|
| `lat-ping-1k-128` | ping (sequential RTT) | 1000 | 1 | 128 B | 0.250ms | 0.319ms | 0.299ms | 0.363ms | 0.684ms | 2.759ms |
| `lat-1p-5k-128` | flood (burst queueing) | 5000 | 1 | 128 B | 94.920ms | 132.026ms | 131.990ms | 156.086ms | 158.860ms | 158.965ms |
| `lat-4p-5k-1k` | flood (burst queueing) | 5000 | 4 | 1024 B | 113.281ms | 132.425ms | 131.457ms | 140.317ms | 144.683ms | 145.365ms |
| `lat-4p-10k-128` | flood (burst queueing) | 10000 | 4 | 128 B | 153.318ms | 204.329ms | 205.865ms | 234.151ms | 237.346ms | 237.477ms |
| `lat-8p-20k-128` | flood (burst queueing) | 20000 | 8 | 128 B | 233.727ms | 310.924ms | 311.170ms | 373.437ms | 400.764ms | 402.811ms |
## What the numbers mean
Product job/event/archive traffic is **JetStream r=3 file**. On this three-LXC stand that is about **16k durable 128 B pubs/s** (about **13k** at 1 KiB). Core NATS is an upper bound for non-durable fan-out: about **0.72.0M msgs/s** aggregate at 128 B, or **~630k msgs/s (~616 MB/s)** at 1 KiB with 4 publishers.
A quiet request-reply is **~0.3 ms** average, **p99 < 1 ms**. Flood rows in the **150500 ms** band are the subscriber catching up after a burst, which is what a job-events mailbox sees if publishers outrun consumers.
Re-run on NS1: `bash scripts/bench.sh`. Raw logs/CSVs are under `results/<utc>/`.

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View file

@ -0,0 +1,3 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
w2OZLH4YWp0DF7nX2fttF4,S0,50000,6400000,456116,58382861.156470,0.109621
w2OZLH4YWp0DF7nX2fttF4,P0,50000,6400000,599004,76672615.503222,0.083472
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 w2OZLH4YWp0DF7nX2fttF4 S0 50000 6400000 456116 58382861.156470 0.109621
3 w2OZLH4YWp0DF7nX2fttF4 P0 50000 6400000 599004 76672615.503222 0.083472

View file

@ -0,0 +1,7 @@
=== core-1p1s-50k-128 ===
NATS Pub/Sub stats: 810,988 msgs/sec ~ 99.00 MB/sec
Pub stats: 599,004 msgs/sec ~ 73.12 MB/sec
Sub stats: 456,116 msgs/sec ~ 55.68 MB/sec
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,9 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
objwjMbBXlRDUb07UVtRo4,S0,100000,12800000,292772,37474879.058831,0.341562
objwjMbBXlRDUb07UVtRo4,S1,100000,12800000,290329,37162115.621242,0.344437
objwjMbBXlRDUb07UVtRo4,S2,100000,12800000,290323,37161444.974130,0.344443
objwjMbBXlRDUb07UVtRo4,S3,100000,12800000,289603,37069299.877433,0.345299
objwjMbBXlRDUb07UVtRo4,P0,25000,3200000,554855,71021459.933110,0.045057
objwjMbBXlRDUb07UVtRo4,P1,25000,3200000,189477,24253105.346766,0.131942
objwjMbBXlRDUb07UVtRo4,P2,25000,3200000,105092,13451809.359579,0.237886
objwjMbBXlRDUb07UVtRo4,P3,25000,3200000,95101,12173034.434871,0.262876
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 objwjMbBXlRDUb07UVtRo4 S0 100000 12800000 292772 37474879.058831 0.341562
3 objwjMbBXlRDUb07UVtRo4 S1 100000 12800000 290329 37162115.621242 0.344437
4 objwjMbBXlRDUb07UVtRo4 S2 100000 12800000 290323 37161444.974130 0.344443
5 objwjMbBXlRDUb07UVtRo4 S3 100000 12800000 289603 37069299.877433 0.345299
6 objwjMbBXlRDUb07UVtRo4 P0 25000 3200000 554855 71021459.933110 0.045057
7 objwjMbBXlRDUb07UVtRo4 P1 25000 3200000 189477 24253105.346766 0.131942
8 objwjMbBXlRDUb07UVtRo4 P2 25000 3200000 105092 13451809.359579 0.237886
9 objwjMbBXlRDUb07UVtRo4 P3 25000 3200000 95101 12173034.434871 0.262876

View file

@ -0,0 +1,17 @@
=== core-4p4s-100k-128 ===
NATS Pub/Sub stats: 1,361,921 msgs/sec ~ 166.25 MB/sec
Pub stats: 379,346 msgs/sec ~ 46.31 MB/sec
[1] 554,855 msgs/sec ~ 67.73 MB/sec (25000 msgs)
[2] 189,477 msgs/sec ~ 23.13 MB/sec (25000 msgs)
[3] 105,092 msgs/sec ~ 12.83 MB/sec (25000 msgs)
[4] 95,101 msgs/sec ~ 11.61 MB/sec (25000 msgs)
min 95,101 | avg 236,131 | max 554,855 | stddev 187,631 msgs
Sub stats: 1,150,536 msgs/sec ~ 140.45 MB/sec
[1] 292,772 msgs/sec ~ 35.74 MB/sec (100000 msgs)
[2] 290,329 msgs/sec ~ 35.44 MB/sec (100000 msgs)
[3] 290,323 msgs/sec ~ 35.44 MB/sec (100000 msgs)
[4] 289,603 msgs/sec ~ 35.35 MB/sec (100000 msgs)
min 289,603 | avg 290,756 | max 292,772 | stddev 1,200 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,9 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
LPWAPBuugXuZD3pcA9R4Q1,S0,50000,51200000,175324,179532297.676261,0.285185
LPWAPBuugXuZD3pcA9R4Q1,S1,50000,51200000,174783,178978214.492079,0.286068
LPWAPBuugXuZD3pcA9R4Q1,S2,50000,51200000,170404,174493875.742093,0.293420
LPWAPBuugXuZD3pcA9R4Q1,S3,50000,51200000,146006,149510306.440412,0.342451
LPWAPBuugXuZD3pcA9R4Q1,P0,12500,12800000,206954,211921364.855709,0.060400
LPWAPBuugXuZD3pcA9R4Q1,P1,12500,12800000,78140,80016334.334450,0.159967
LPWAPBuugXuZD3pcA9R4Q1,P2,12500,12800000,47044,48173938.085417,0.265704
LPWAPBuugXuZD3pcA9R4Q1,P3,12500,12800000,43981,45036904.770320,0.284211
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 LPWAPBuugXuZD3pcA9R4Q1 S0 50000 51200000 175324 179532297.676261 0.285185
3 LPWAPBuugXuZD3pcA9R4Q1 S1 50000 51200000 174783 178978214.492079 0.286068
4 LPWAPBuugXuZD3pcA9R4Q1 S2 50000 51200000 170404 174493875.742093 0.293420
5 LPWAPBuugXuZD3pcA9R4Q1 S3 50000 51200000 146006 149510306.440412 0.342451
6 LPWAPBuugXuZD3pcA9R4Q1 P0 12500 12800000 206954 211921364.855709 0.060400
7 LPWAPBuugXuZD3pcA9R4Q1 P1 12500 12800000 78140 80016334.334450 0.159967
8 LPWAPBuugXuZD3pcA9R4Q1 P2 12500 12800000 47044 48173938.085417 0.265704
9 LPWAPBuugXuZD3pcA9R4Q1 P3 12500 12800000 43981 45036904.770320 0.284211

View file

@ -0,0 +1,17 @@
=== core-4p4s-50k-1k ===
NATS Pub/Sub stats: 695,192 msgs/sec ~ 678.90 MB/sec
Pub stats: 175,725 msgs/sec ~ 171.61 MB/sec
[1] 206,954 msgs/sec ~ 202.10 MB/sec (12500 msgs)
[2] 78,140 msgs/sec ~ 76.31 MB/sec (12500 msgs)
[3] 47,044 msgs/sec ~ 45.94 MB/sec (12500 msgs)
[4] 43,981 msgs/sec ~ 42.95 MB/sec (12500 msgs)
min 43,981 | avg 94,029 | max 206,954 | stddev 66,552 msgs
Sub stats: 584,024 msgs/sec ~ 570.34 MB/sec
[1] 175,324 msgs/sec ~ 171.22 MB/sec (50000 msgs)
[2] 174,783 msgs/sec ~ 170.69 MB/sec (50000 msgs)
[3] 170,404 msgs/sec ~ 166.41 MB/sec (50000 msgs)
[4] 146,006 msgs/sec ~ 142.58 MB/sec (50000 msgs)
min 146,006 | avg 166,629 | max 175,324 | stddev 12,058 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,17 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
D29xFtCiL3n1hFtnnty2bJ,S0,200000,25600000,275094,35212130.182711,0.727022
D29xFtCiL3n1hFtnnty2bJ,S1,200000,25600000,274807,35175364.678326,0.727782
D29xFtCiL3n1hFtnnty2bJ,S2,200000,25600000,274647,35154883.000958,0.728206
D29xFtCiL3n1hFtnnty2bJ,S3,200000,25600000,274140,35089962.583779,0.729553
D29xFtCiL3n1hFtnnty2bJ,S4,200000,25600000,273964,35067496.657328,0.730021
D29xFtCiL3n1hFtnnty2bJ,S5,200000,25600000,228037,29188847.958244,0.877047
D29xFtCiL3n1hFtnnty2bJ,S6,200000,25600000,227447,29113332.808421,0.879322
D29xFtCiL3n1hFtnnty2bJ,S7,200000,25600000,232494,29759235.647424,0.860237
D29xFtCiL3n1hFtnnty2bJ,P0,25000,3200000,127444,16312929.457622,0.196163
D29xFtCiL3n1hFtnnty2bJ,P1,25000,3200000,77933,9975435.116946,0.320788
D29xFtCiL3n1hFtnnty2bJ,P2,25000,3200000,77633,9937136.216776,0.322024
D29xFtCiL3n1hFtnnty2bJ,P3,25000,3200000,76965,9851558.471756,0.324822
D29xFtCiL3n1hFtnnty2bJ,P4,25000,3200000,77205,9882296.902740,0.323811
D29xFtCiL3n1hFtnnty2bJ,P5,25000,3200000,44296,5669906.917475,0.564383
D29xFtCiL3n1hFtnnty2bJ,P6,25000,3200000,35857,4589723.695277,0.697210
D29xFtCiL3n1hFtnnty2bJ,P7,25000,3200000,35509,4545175.649861,0.704043
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 D29xFtCiL3n1hFtnnty2bJ S0 200000 25600000 275094 35212130.182711 0.727022
3 D29xFtCiL3n1hFtnnty2bJ S1 200000 25600000 274807 35175364.678326 0.727782
4 D29xFtCiL3n1hFtnnty2bJ S2 200000 25600000 274647 35154883.000958 0.728206
5 D29xFtCiL3n1hFtnnty2bJ S3 200000 25600000 274140 35089962.583779 0.729553
6 D29xFtCiL3n1hFtnnty2bJ S4 200000 25600000 273964 35067496.657328 0.730021
7 D29xFtCiL3n1hFtnnty2bJ S5 200000 25600000 228037 29188847.958244 0.877047
8 D29xFtCiL3n1hFtnnty2bJ S6 200000 25600000 227447 29113332.808421 0.879322
9 D29xFtCiL3n1hFtnnty2bJ S7 200000 25600000 232494 29759235.647424 0.860237
10 D29xFtCiL3n1hFtnnty2bJ P0 25000 3200000 127444 16312929.457622 0.196163
11 D29xFtCiL3n1hFtnnty2bJ P1 25000 3200000 77933 9975435.116946 0.320788
12 D29xFtCiL3n1hFtnnty2bJ P2 25000 3200000 77633 9937136.216776 0.322024
13 D29xFtCiL3n1hFtnnty2bJ P3 25000 3200000 76965 9851558.471756 0.324822
14 D29xFtCiL3n1hFtnnty2bJ P4 25000 3200000 77205 9882296.902740 0.323811
15 D29xFtCiL3n1hFtnnty2bJ P5 25000 3200000 44296 5669906.917475 0.564383
16 D29xFtCiL3n1hFtnnty2bJ P6 25000 3200000 35857 4589723.695277 0.697210
17 D29xFtCiL3n1hFtnnty2bJ P7 25000 3200000 35509 4545175.649861 0.704043

View file

@ -0,0 +1,25 @@
=== core-8p8s-200k-128 ===
NATS Pub/Sub stats: 1,998,733 msgs/sec ~ 243.99 MB/sec
Pub stats: 283,259 msgs/sec ~ 34.58 MB/sec
[1] 127,444 msgs/sec ~ 15.56 MB/sec (25000 msgs)
[2] 77,933 msgs/sec ~ 9.51 MB/sec (25000 msgs)
[3] 77,633 msgs/sec ~ 9.48 MB/sec (25000 msgs)
[4] 76,965 msgs/sec ~ 9.40 MB/sec (25000 msgs)
[5] 77,205 msgs/sec ~ 9.42 MB/sec (25000 msgs)
[6] 44,296 msgs/sec ~ 5.41 MB/sec (25000 msgs)
[7] 35,857 msgs/sec ~ 4.38 MB/sec (25000 msgs)
[8] 35,509 msgs/sec ~ 4.33 MB/sec (25000 msgs)
min 35,509 | avg 69,105 | max 127,444 | stddev 28,572 msgs
Sub stats: 1,780,589 msgs/sec ~ 217.36 MB/sec
[1] 275,094 msgs/sec ~ 33.58 MB/sec (200000 msgs)
[2] 274,807 msgs/sec ~ 33.55 MB/sec (200000 msgs)
[3] 274,647 msgs/sec ~ 33.53 MB/sec (200000 msgs)
[4] 274,140 msgs/sec ~ 33.46 MB/sec (200000 msgs)
[5] 273,964 msgs/sec ~ 33.44 MB/sec (200000 msgs)
[6] 228,037 msgs/sec ~ 27.84 MB/sec (200000 msgs)
[7] 227,447 msgs/sec ~ 27.76 MB/sec (200000 msgs)
[8] 232,494 msgs/sec ~ 28.38 MB/sec (200000 msgs)
min 227,447 | avg 257,578 | max 275,094 | stddev 21,930 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,92 @@
execution_host=NS1.GEORGELAMBERT.ORG
execution_ip=70.88.205.138
hostname=NS1.GEORGELAMBERT.ORG
utc=2026-09-12T05:33:03Z
whoami=marchon
pwd=/home/marchon/verae-src/verae-nats-cluster
uname=Linux NS1.GEORGELAMBERT.ORG 6.17.2-1-pve #1 SMP PREEMPT_DYNAMIC PMX 6.17.2-1 (2025-10-21T11:55Z) x86_64 GNU/Linux
nproc=40
loadavg=9.02 8.82 8.44 6/3847 224483
client_vmid=510
nats_url=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
js_extra_memory=1
compare_dir=/home/marchon/verae-src/verae-nats-cluster/results/20260912T051237Z
--- nats 511 max_mem ---
max_mem: 8G
--- nats 511 jetstream mount ---
nats-js on /var/lib/nats/jetstream type tmpfs (rw,relatime,size=8388608k,uid=100000,gid=100000,inode64)
--- free ---
total used free shared buff/cache available
Mem: 377Gi 38Gi 324Gi 4.3Gi 21Gi 339Gi
Swap: 8.0Gi 0B 8.0Gi
--- pct list ---
VMID Status Lock Name
100 stopped CT100
101 stopped CT101
102 stopped CT102
103 stopped CT103
104 stopped CT104
105 stopped CT105
106 stopped CT106
107 stopped CT107
108 stopped CT108
109 stopped CT109
110 stopped CT110
111 stopped CT111
112 stopped CT112
113 stopped CT113
114 stopped CT114
115 stopped CT115
116 stopped paul
117 stopped CT117
118 stopped CT118
119 stopped CT119
120 stopped rustdeskserver
121 stopped CT121
122 stopped CT122
123 stopped CT123
124 stopped bdross
200 stopped CT200
201 stopped CT201
202 stopped CT202
300 running mail.veraetime.info
400 stopped evercycle-api
501 running pki
502 running peergos-a
503 running peergos-b
504 stopped minio
510 running verae-px-worker
511 running nats-a
512 running nats-b
513 running nats-c
2000 stopped CT2000
2001 stopped CT2001
2002 stopped CT2002
--- pct config 510 ---
cores: 8
hostname: verae-px-worker
memory: 16384
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:BD:5D:62,ip=10.10.10.20/24,type=veth
rootfs: SSD2:subvol-510-disk-0,size=16G
swap: 512
--- pct config 511 ---
cores: 8
hostname: nats-a
memory: 16384
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:CF:AC:68,ip=10.10.10.21/24,type=veth
rootfs: SSD2:subvol-511-disk-0,size=8G
swap: 256
--- pct config 512 ---
cores: 8
hostname: nats-b
memory: 16384
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:42:73:A2,ip=10.10.10.22/24,type=veth
rootfs: SSD2:subvol-512-disk-0,size=8G
swap: 256
--- pct config 513 ---
cores: 8
hostname: nats-c
memory: 16384
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:1B:9B:DC,ip=10.10.10.23/24,type=veth
rootfs: SSD2:subvol-513-disk-0,size=8G
swap: 256

View file

@ -0,0 +1,92 @@
execution_host=NS1.GEORGELAMBERT.ORG
execution_ip=70.88.205.138
hostname=NS1.GEORGELAMBERT.ORG
utc=2026-09-12T05:31:20Z
whoami=marchon
pwd=/home/marchon/verae-src/verae-nats-cluster
uname=Linux NS1.GEORGELAMBERT.ORG 6.17.2-1-pve #1 SMP PREEMPT_DYNAMIC PMX 6.17.2-1 (2025-10-21T11:55Z) x86_64 GNU/Linux
nproc=40
loadavg=8.77 8.39 8.26 6/3849 198471
client_vmid=510
nats_url=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
js_extra_memory=1
compare_dir=/home/marchon/verae-src/verae-nats-cluster/results/20260912T051237Z
--- nats 511 max_mem ---
max_mem: 8G
--- nats 511 jetstream mount ---
nats-js on /var/lib/nats/jetstream type tmpfs (rw,relatime,size=8388608k,uid=100000,gid=100000,inode64)
--- free ---
total used free shared buff/cache available
Mem: 377Gi 38Gi 324Gi 4.2Gi 21Gi 339Gi
Swap: 8.0Gi 0B 8.0Gi
--- pct list ---
VMID Status Lock Name
100 stopped CT100
101 stopped CT101
102 stopped CT102
103 stopped CT103
104 stopped CT104
105 stopped CT105
106 stopped CT106
107 stopped CT107
108 stopped CT108
109 stopped CT109
110 stopped CT110
111 stopped CT111
112 stopped CT112
113 stopped CT113
114 stopped CT114
115 stopped CT115
116 stopped paul
117 stopped CT117
118 stopped CT118
119 stopped CT119
120 stopped rustdeskserver
121 stopped CT121
122 stopped CT122
123 stopped CT123
124 stopped bdross
200 stopped CT200
201 stopped CT201
202 stopped CT202
300 running mail.veraetime.info
400 stopped evercycle-api
501 running pki
502 running peergos-a
503 running peergos-b
504 stopped minio
510 running verae-px-worker
511 running nats-a
512 running nats-b
513 running nats-c
2000 stopped CT2000
2001 stopped CT2001
2002 stopped CT2002
--- pct config 510 ---
cores: 8
hostname: verae-px-worker
memory: 16384
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:BD:5D:62,ip=10.10.10.20/24,type=veth
rootfs: SSD2:subvol-510-disk-0,size=16G
swap: 512
--- pct config 511 ---
cores: 8
hostname: nats-a
memory: 16384
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:CF:AC:68,ip=10.10.10.21/24,type=veth
rootfs: SSD2:subvol-511-disk-0,size=8G
swap: 256
--- pct config 512 ---
cores: 8
hostname: nats-b
memory: 16384
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:42:73:A2,ip=10.10.10.22/24,type=veth
rootfs: SSD2:subvol-512-disk-0,size=8G
swap: 256
--- pct config 513 ---
cores: 8
hostname: nats-c
memory: 16384
net0: name=eth0,bridge=vmbr1,gw=10.10.10.1,hwaddr=BC:24:11:1B:9B:DC,ip=10.10.10.23/24,type=veth
rootfs: SSD2:subvol-513-disk-0,size=8G
swap: 256

View file

@ -0,0 +1,2 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
DsDjrcOoYbw8k54T1mMXxq,P0,40000,2560000,17388,2225703.026620,1.150198
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 DsDjrcOoYbw8k54T1mMXxq P0 40000 2560000 17388 2225703.026620 1.150198

View file

@ -0,0 +1,5 @@
=== js-1p-20k-128-r3 ===
Pub stats: 17,388 msgs/sec ~ 2.12 MB/sec
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
JYqsv0sXzEqkC0r49q0aE5,S0,20203,1280000,5135,657394.514895,1.947080
JYqsv0sXzEqkC0r49q0aE5,S1,20210,1280000,4971,636317.997133,2.011573
JYqsv0sXzEqkC0r49q0aE5,P0,20000,1280000,5099,652788.600986,1.960819
JYqsv0sXzEqkC0r49q0aE5,P1,20000,1280000,4979,637405.779512,2.008140
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 JYqsv0sXzEqkC0r49q0aE5 S0 20203 1280000 5135 657394.514895 1.947080
3 JYqsv0sXzEqkC0r49q0aE5 S1 20210 1280000 4971 636317.997133 2.011573
4 JYqsv0sXzEqkC0r49q0aE5 P0 20000 1280000 5099 652788.600986 1.960819
5 JYqsv0sXzEqkC0r49q0aE5 P1 20000 1280000 4979 637405.779512 2.008140

View file

@ -0,0 +1,13 @@
=== js-2p2s-20k-128-r3 ===
NATS Pub/Sub stats: 19,876 msgs/sec ~ 2.43 MB/sec
Pub stats: 9,959 msgs/sec ~ 1.22 MB/sec
[1] 5,099 msgs/sec ~ 637.49 KB/sec (10000 msgs)
[2] 4,979 msgs/sec ~ 622.47 KB/sec (10000 msgs)
min 4,979 | avg 5,039 | max 5,099 | stddev 60 msgs
Sub stats: 9,942 msgs/sec ~ 1.21 MB/sec
[1] 5,135 msgs/sec ~ 641.99 KB/sec (10000 msgs)
[2] 4,971 msgs/sec ~ 621.40 KB/sec (10000 msgs)
min 4,971 | avg 5,053 | max 5,135 | stddev 82 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
r1r7AI1sRr29EvqNG14gSh,P0,10000,5120000,7677,7861269.752874,0.651294
r1r7AI1sRr29EvqNG14gSh,P1,10000,5120000,4571,4680909.596986,1.093805
r1r7AI1sRr29EvqNG14gSh,P2,10000,5120000,4529,4637905.946623,1.103946
r1r7AI1sRr29EvqNG14gSh,P3,10000,5120000,4528,4637319.175494,1.104086
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 r1r7AI1sRr29EvqNG14gSh P0 10000 5120000 7677 7861269.752874 0.651294
3 r1r7AI1sRr29EvqNG14gSh P1 10000 5120000 4571 4680909.596986 1.093805
4 r1r7AI1sRr29EvqNG14gSh P2 10000 5120000 4529 4637905.946623 1.103946
5 r1r7AI1sRr29EvqNG14gSh P3 10000 5120000 4528 4637319.175494 1.104086

View file

@ -0,0 +1,10 @@
=== js-4p-20k-1k-r3 ===
Pub stats: 18,114 msgs/sec ~ 17.69 MB/sec
[1] 7,677 msgs/sec ~ 7.50 MB/sec (5000 msgs)
[2] 4,571 msgs/sec ~ 4.46 MB/sec (5000 msgs)
[3] 4,529 msgs/sec ~ 4.42 MB/sec (5000 msgs)
[4] 4,528 msgs/sec ~ 4.42 MB/sec (5000 msgs)
min 4,528 | avg 5,326 | max 7,677 | stddev 1,357 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
6cJTgCeHUXHowXNlC39Tws,P0,25000,1600000,7724,988748.856206,1.618207
6cJTgCeHUXHowXNlC39Tws,P1,25000,1600000,7704,986199.433317,1.622390
6cJTgCeHUXHowXNlC39Tws,P2,25000,1600000,5713,731384.231657,2.187633
6cJTgCeHUXHowXNlC39Tws,P3,25000,1600000,5713,731308.958368,2.187858
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 6cJTgCeHUXHowXNlC39Tws P0 25000 1600000 7724 988748.856206 1.618207
3 6cJTgCeHUXHowXNlC39Tws P1 25000 1600000 7704 986199.433317 1.622390
4 6cJTgCeHUXHowXNlC39Tws P2 25000 1600000 5713 731384.231657 2.187633
5 6cJTgCeHUXHowXNlC39Tws P3 25000 1600000 5713 731308.958368 2.187858

View file

@ -0,0 +1,10 @@
=== js-4p-50k-128-r3 ===
Pub stats: 22,853 msgs/sec ~ 2.79 MB/sec
[1] 7,724 msgs/sec ~ 965.58 KB/sec (12500 msgs)
[2] 7,704 msgs/sec ~ 963.09 KB/sec (12500 msgs)
[3] 5,713 msgs/sec ~ 714.24 KB/sec (12500 msgs)
[4] 5,713 msgs/sec ~ 714.17 KB/sec (12500 msgs)
min 5,713 | avg 6,713 | max 7,724 | stddev 1,000 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,2 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
jHJGzEaQyqmtfzAfyQRddn,P0,40000,2560000,22153,2835624.882291,0.902799
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 jHJGzEaQyqmtfzAfyQRddn P0 40000 2560000 22153 2835624.882291 0.902799

View file

@ -0,0 +1,5 @@
=== js-mem-1p-20k-128-r3 ===
Pub stats: 22,153 msgs/sec ~ 2.70 MB/sec
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
bSUG5M5Cdh9fEhPsY8MWLm,P0,10000,5120000,9256,9478798.103952,0.540153
bSUG5M5Cdh9fEhPsY8MWLm,P1,10000,5120000,8901,9115347.820727,0.561690
bSUG5M5Cdh9fEhPsY8MWLm,P2,10000,5120000,7192,7365226.588506,0.695159
bSUG5M5Cdh9fEhPsY8MWLm,P3,10000,5120000,7171,7343566.738925,0.697209
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 bSUG5M5Cdh9fEhPsY8MWLm P0 10000 5120000 9256 9478798.103952 0.540153
3 bSUG5M5Cdh9fEhPsY8MWLm P1 10000 5120000 8901 9115347.820727 0.561690
4 bSUG5M5Cdh9fEhPsY8MWLm P2 10000 5120000 7192 7365226.588506 0.695159
5 bSUG5M5Cdh9fEhPsY8MWLm P3 10000 5120000 7171 7343566.738925 0.697209

View file

@ -0,0 +1,10 @@
=== js-mem-4p-20k-1k-r3 ===
Pub stats: 28,685 msgs/sec ~ 28.01 MB/sec
[1] 9,256 msgs/sec ~ 9.04 MB/sec (5000 msgs)
[2] 8,901 msgs/sec ~ 8.69 MB/sec (5000 msgs)
[3] 7,192 msgs/sec ~ 7.02 MB/sec (5000 msgs)
[4] 7,171 msgs/sec ~ 7.00 MB/sec (5000 msgs)
min 7,171 | avg 8,130 | max 9,256 | stddev 956 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,5 @@
#RunID,ClientID,MsgCount,MsgBytes,MsgsPerSec,BytesPerSec,DurationSecs
RCjYO8CWEOKsynfDUe3izo,P0,25000,1600000,9194,1176894.303068,1.359510
RCjYO8CWEOKsynfDUe3izo,P1,25000,1600000,9199,1177484.153608,1.358829
RCjYO8CWEOKsynfDUe3izo,P2,25000,1600000,9144,1170517.752374,1.366916
RCjYO8CWEOKsynfDUe3izo,P3,25000,1600000,9097,1164445.806755,1.374044
1 #RunID ClientID MsgCount MsgBytes MsgsPerSec BytesPerSec DurationSecs
2 RCjYO8CWEOKsynfDUe3izo P0 25000 1600000 9194 1176894.303068 1.359510
3 RCjYO8CWEOKsynfDUe3izo P1 25000 1600000 9199 1177484.153608 1.358829
4 RCjYO8CWEOKsynfDUe3izo P2 25000 1600000 9144 1170517.752374 1.366916
5 RCjYO8CWEOKsynfDUe3izo P3 25000 1600000 9097 1164445.806755 1.374044

View file

@ -0,0 +1,10 @@
=== js-mem-4p-50k-128-r3 ===
Pub stats: 36,355 msgs/sec ~ 4.44 MB/sec
[1] 9,194 msgs/sec ~ 1.12 MB/sec (12500 msgs)
[2] 9,199 msgs/sec ~ 1.12 MB/sec (12500 msgs)
[3] 9,144 msgs/sec ~ 1.12 MB/sec (12500 msgs)
[4] 9,097 msgs/sec ~ 1.11 MB/sec (12500 msgs)
min 9,097 | avg 9,158 | max 9,199 | stddev 41 msgs
Saved metric data in csv file /tmp/bench.csv

View file

@ -0,0 +1,2 @@
=== lat-1p-5k-128 ===
{"count":5000,"pubs":1,"size":128,"mode":"flood","min_us":94920,"avg_us":132026,"p50_us":131990,"p90_us":156086,"p99_us":158860,"max_us":158965,"min":"94.920ms","avg":"132.026ms","p50":"131.990ms","p90":"156.086ms","p99":"158.860ms","max":"158.965ms"}

View file

@ -0,0 +1,2 @@
=== lat-4p-10k-128 ===
{"count":10000,"pubs":4,"size":128,"mode":"flood","min_us":153318,"avg_us":204329,"p50_us":205865,"p90_us":234151,"p99_us":237346,"max_us":237477,"min":"153.318ms","avg":"204.329ms","p50":"205.865ms","p90":"234.151ms","p99":"237.346ms","max":"237.477ms"}

View file

@ -0,0 +1,2 @@
=== lat-4p-5k-1k ===
{"count":5000,"pubs":4,"size":1024,"mode":"flood","min_us":113281,"avg_us":132425,"p50_us":131457,"p90_us":140317,"p99_us":144683,"max_us":145365,"min":"113.281ms","avg":"132.425ms","p50":"131.457ms","p90":"140.317ms","p99":"144.683ms","max":"145.365ms"}

View file

@ -0,0 +1,2 @@
=== lat-8p-20k-128 ===
{"count":20000,"pubs":8,"size":128,"mode":"flood","min_us":233727,"avg_us":310924,"p50_us":311170,"p90_us":373437,"p99_us":400764,"max_us":402811,"min":"233.727ms","avg":"310.924ms","p50":"311.170ms","p90":"373.437ms","p99":"400.764ms","max":"402.811ms"}

Some files were not shown because too many files have changed in this diff Show more