@peerbit/shared-log 13.1.17 → 13.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/benchmark/index.js +91 -29
- package/dist/benchmark/index.js.map +1 -1
- package/dist/benchmark/native-graph.js +120 -10
- package/dist/benchmark/native-graph.js.map +1 -1
- package/dist/benchmark/network-preset-e2e.d.ts +2 -0
- package/dist/benchmark/network-preset-e2e.d.ts.map +1 -0
- package/dist/benchmark/network-preset-e2e.js +497 -0
- package/dist/benchmark/network-preset-e2e.js.map +1 -0
- package/dist/benchmark/receive-prune.d.ts +2 -0
- package/dist/benchmark/receive-prune.d.ts.map +1 -0
- package/dist/benchmark/receive-prune.js +816 -0
- package/dist/benchmark/receive-prune.js.map +1 -0
- package/dist/benchmark/sync-catchup.d.ts +1 -2
- package/dist/benchmark/sync-catchup.d.ts.map +1 -1
- package/dist/benchmark/sync-catchup.js +175 -7
- package/dist/benchmark/sync-catchup.js.map +1 -1
- package/dist/src/checked-prune.d.ts +3 -0
- package/dist/src/checked-prune.d.ts.map +1 -1
- package/dist/src/checked-prune.js +24 -0
- package/dist/src/checked-prune.js.map +1 -1
- package/dist/src/exchange-heads.d.ts +238 -1
- package/dist/src/exchange-heads.d.ts.map +1 -1
- package/dist/src/exchange-heads.js +1512 -36
- package/dist/src/exchange-heads.js.map +1 -1
- package/dist/src/index.d.ts +276 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7358 -666
- package/dist/src/index.js.map +1 -1
- package/dist/src/pid.d.ts.map +1 -1
- package/dist/src/pid.js +25 -9
- package/dist/src/pid.js.map +1 -1
- package/dist/src/ranges.d.ts +11 -2
- package/dist/src/ranges.d.ts.map +1 -1
- package/dist/src/ranges.js +74 -30
- package/dist/src/ranges.js.map +1 -1
- package/dist/src/sync/index.d.ts +77 -2
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/rateless-iblt.d.ts +11 -5
- package/dist/src/sync/rateless-iblt.d.ts.map +1 -1
- package/dist/src/sync/rateless-iblt.js +123 -60
- package/dist/src/sync/rateless-iblt.js.map +1 -1
- package/dist/src/sync/simple.d.ts +56 -4
- package/dist/src/sync/simple.d.ts.map +1 -1
- package/dist/src/sync/simple.js +495 -63
- package/dist/src/sync/simple.js.map +1 -1
- package/dist/src/utils.d.ts +2 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +49 -2
- package/dist/src/utils.js.map +1 -1
- package/package.json +27 -17
- package/src/checked-prune.ts +27 -0
- package/src/exchange-heads.ts +2018 -41
- package/src/index.ts +13114 -3167
- package/src/pid.ts +24 -13
- package/src/ranges.ts +90 -40
- package/src/sync/index.ts +115 -2
- package/src/sync/rateless-iblt.ts +154 -75
- package/src/sync/simple.ts +590 -95
- package/src/utils.ts +73 -3
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
// End-to-end benchmark of the native network preset (`peerbit/rust`) against
|
|
2
|
+
// the all-default TS client. Two real Peerbit nodes in one process, connected
|
|
3
|
+
// over real TCP (127.0.0.1), open the same EventStore — mirroring
|
|
4
|
+
// `test/network-e2e-native.spec.ts`. Three scenarios:
|
|
5
|
+
//
|
|
6
|
+
// cold-sync N independent entries written on peer1 before peer2
|
|
7
|
+
// connects; measures entries/s until peer2 converges.
|
|
8
|
+
// live-puts sustained awaited puts on peer1 while peer2 replicates;
|
|
9
|
+
// measures peer2-visible throughput and per-put visibility
|
|
10
|
+
// latency (p50/p95, attributed by log-length polling).
|
|
11
|
+
// stash-pressure native leg only: a large-payload burst below and above
|
|
12
|
+
// the wire-sync stash caps (512 msgs / 64 MB). The inbound
|
|
13
|
+
// wire keeps end-to-end pace with the consumer in a 2-node
|
|
14
|
+
// run (per-frame dispatch backpressure), so to reach the
|
|
15
|
+
// FIFO boundary the receiver's program dispatch is gated
|
|
16
|
+
// (held and replayed in order) while the burst arrives —
|
|
17
|
+
// the stalled-consumer situation the caps exist for.
|
|
18
|
+
// Asserts convergence (evicted messages are recovered by
|
|
19
|
+
// the TS fallback decode) and reports how the commit-phase
|
|
20
|
+
// throughput degrades across the eviction boundary.
|
|
21
|
+
//
|
|
22
|
+
// Legs: `default` = `Peerbit.create()` (pure TS wire path) and `native` =
|
|
23
|
+
// `Peerbit.create(createRustPeerbitOptions())` (rust core stream + wire-sync
|
|
24
|
+
// receive fusion + native shared-log defaults).
|
|
25
|
+
//
|
|
26
|
+
// Strictly sequential: legs and runs never overlap; each run creates and
|
|
27
|
+
// stops its own pair of clients. Defaults: 2 warmup + 5 measured runs.
|
|
28
|
+
//
|
|
29
|
+
// Run with:
|
|
30
|
+
// cd packages/programs/data/shared-log
|
|
31
|
+
// node --loader ts-node/esm ./benchmark/network-preset-e2e.ts
|
|
32
|
+
// NET_BENCH_SCENARIOS=cold-sync NET_BENCH_RUNS=3 node --loader ts-node/esm ./benchmark/network-preset-e2e.ts
|
|
33
|
+
// NET_BENCH_COLD_COUNT=5000 BENCH_JSON=1 node --loader ts-node/esm ./benchmark/network-preset-e2e.ts
|
|
34
|
+
//
|
|
35
|
+
// Caveats:
|
|
36
|
+
// - Both nodes share one process (and one JS thread), like the rest of the
|
|
37
|
+
// networked benchmarks in this directory: numbers measure the combined
|
|
38
|
+
// sender+receiver pipeline, not isolated per-node cost.
|
|
39
|
+
// - Per-put latency attributes visibility by log-length order, which is an
|
|
40
|
+
// approximation when entries commit out of order on the receiver.
|
|
41
|
+
import { waitForResolved } from "@peerbit/time";
|
|
42
|
+
import { expect } from "chai";
|
|
43
|
+
import { performance } from "node:perf_hooks";
|
|
44
|
+
import { Peerbit } from "peerbit";
|
|
45
|
+
import { createRustPeerbitOptions } from "peerbit/rust";
|
|
46
|
+
import { EventStore } from "../test/utils/stores/event-store.js";
|
|
47
|
+
const envInt = (name, fallback) => {
|
|
48
|
+
const value = process.env[name];
|
|
49
|
+
return value ? Number.parseInt(value, 10) : fallback;
|
|
50
|
+
};
|
|
51
|
+
const warmupRuns = envInt("NET_BENCH_WARMUP", 2);
|
|
52
|
+
const measuredRuns = envInt("NET_BENCH_RUNS", 5);
|
|
53
|
+
const timeoutMs = envInt("NET_BENCH_TIMEOUT", 120_000);
|
|
54
|
+
const coldCount = envInt("NET_BENCH_COLD_COUNT", 8000);
|
|
55
|
+
const coldPayload = envInt("NET_BENCH_COLD_PAYLOAD", 1024);
|
|
56
|
+
const liveCount = envInt("NET_BENCH_LIVE_COUNT", 2000);
|
|
57
|
+
const livePayload = envInt("NET_BENCH_LIVE_PAYLOAD", 256);
|
|
58
|
+
const stashPayload = envInt("NET_BENCH_STASH_PAYLOAD", 128 * 1024);
|
|
59
|
+
const stashBelowCount = envInt("NET_BENCH_STASH_BELOW_COUNT", 256);
|
|
60
|
+
const stashAboveCount = envInt("NET_BENCH_STASH_ABOVE_COUNT", 1024);
|
|
61
|
+
const captureProfile = process.env.NET_BENCH_PROFILE !== "0";
|
|
62
|
+
const allScenarios = ["cold-sync", "live-puts", "stash-pressure"];
|
|
63
|
+
const scenarios = (process.env.NET_BENCH_SCENARIOS?.split(",")
|
|
64
|
+
.map((x) => x.trim())
|
|
65
|
+
.filter(Boolean) ?? [...allScenarios]).map((name) => {
|
|
66
|
+
if (!allScenarios.includes(name)) {
|
|
67
|
+
throw new Error(`Unknown scenario '${name}'`);
|
|
68
|
+
}
|
|
69
|
+
return name;
|
|
70
|
+
});
|
|
71
|
+
const legs = (process.env.NET_BENCH_LEGS?.split(",")
|
|
72
|
+
.map((x) => x.trim())
|
|
73
|
+
.filter(Boolean) ?? ["default", "native"]).map((name) => {
|
|
74
|
+
if (name !== "default" && name !== "native") {
|
|
75
|
+
throw new Error(`Unknown leg '${name}'`);
|
|
76
|
+
}
|
|
77
|
+
return name;
|
|
78
|
+
});
|
|
79
|
+
const createClient = (leg) => leg === "native"
|
|
80
|
+
? Peerbit.create({ ...createRustPeerbitOptions() })
|
|
81
|
+
: Peerbit.create();
|
|
82
|
+
const makePayload = (index, size) => {
|
|
83
|
+
const prefix = `${index}-`;
|
|
84
|
+
return prefix.length >= size
|
|
85
|
+
? prefix
|
|
86
|
+
: prefix + "x".repeat(size - prefix.length);
|
|
87
|
+
};
|
|
88
|
+
const mean = (samples) => samples.reduce((acc, x) => acc + x, 0) / samples.length;
|
|
89
|
+
const stdev = (samples) => {
|
|
90
|
+
if (samples.length < 2) {
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
const m = mean(samples);
|
|
94
|
+
return Math.sqrt(samples.reduce((acc, x) => acc + (x - m) * (x - m), 0) /
|
|
95
|
+
(samples.length - 1));
|
|
96
|
+
};
|
|
97
|
+
const percentile = (samples, p) => {
|
|
98
|
+
if (samples.length === 0) {
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
const sorted = [...samples].sort((a, b) => a - b);
|
|
102
|
+
const index = Math.min(sorted.length - 1, Math.max(0, Math.ceil((p / 100) * sorted.length) - 1));
|
|
103
|
+
return sorted[index];
|
|
104
|
+
};
|
|
105
|
+
const fmt = (value, digits = 1) => Number.isFinite(value) ? value.toFixed(digits) : "n/a";
|
|
106
|
+
const wireSyncOf = (client) => client.nativeNetwork?.wireSync;
|
|
107
|
+
const sumProfile = (events, name, pick) => events
|
|
108
|
+
.filter((event) => event.name === name)
|
|
109
|
+
.reduce((sum, event) => sum + pick(event), 0);
|
|
110
|
+
const openPair = async (leg) => {
|
|
111
|
+
const peer1 = await createClient(leg);
|
|
112
|
+
const peer2 = await createClient(leg);
|
|
113
|
+
const events1 = [];
|
|
114
|
+
const events2 = [];
|
|
115
|
+
const store = new EventStore();
|
|
116
|
+
// no onChange consumer so the native-leg client defaults (raw
|
|
117
|
+
// exchange-heads + wire-sync receive fusion) stay applicable; a
|
|
118
|
+
// profile-only sync option does not override them
|
|
119
|
+
const openArgs = (events) => ({
|
|
120
|
+
args: {
|
|
121
|
+
replicate: { factor: 1 },
|
|
122
|
+
timeUntilRoleMaturity: 0,
|
|
123
|
+
sync: captureProfile
|
|
124
|
+
? { profile: (event) => events.push(event) }
|
|
125
|
+
: undefined,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
const db1 = await peer1.open(store.clone(), openArgs(events1));
|
|
129
|
+
const db2 = await peer2.open(store.clone(), openArgs(events2));
|
|
130
|
+
return { peer1, peer2, db1, db2, events1, events2 };
|
|
131
|
+
};
|
|
132
|
+
const stopPair = async (pair) => {
|
|
133
|
+
await pair.peer1.stop();
|
|
134
|
+
await pair.peer2.stop();
|
|
135
|
+
};
|
|
136
|
+
/** Shared by cold-sync and stash-pressure: seed peer1, dial, time convergence. */
|
|
137
|
+
const bulkSyncOnce = async (leg, entryCount, payloadSize) => {
|
|
138
|
+
const pair = await openPair(leg);
|
|
139
|
+
const { peer1, peer2, db1, db2, events1, events2 } = pair;
|
|
140
|
+
let sampler;
|
|
141
|
+
try {
|
|
142
|
+
for (let index = 0; index < entryCount; index++) {
|
|
143
|
+
await db1.add(makePayload(index, payloadSize), { meta: { next: [] } });
|
|
144
|
+
}
|
|
145
|
+
expect(db1.log.log.length).to.equal(entryCount);
|
|
146
|
+
let maxStashLength = 0;
|
|
147
|
+
const wireSync = wireSyncOf(peer2);
|
|
148
|
+
if (wireSync) {
|
|
149
|
+
sampler = setInterval(() => {
|
|
150
|
+
const length = wireSync.stashLength;
|
|
151
|
+
if (typeof length === "number" && length > maxStashLength) {
|
|
152
|
+
maxStashLength = length;
|
|
153
|
+
}
|
|
154
|
+
}, 2);
|
|
155
|
+
}
|
|
156
|
+
await peer2.dial(peer1.getMultiaddrs());
|
|
157
|
+
const t0 = performance.now();
|
|
158
|
+
await waitForResolved(() => {
|
|
159
|
+
expect(db2.log.log.length).to.equal(entryCount);
|
|
160
|
+
}, {
|
|
161
|
+
timeout: timeoutMs,
|
|
162
|
+
delayInterval: 10,
|
|
163
|
+
timeoutMessage: `${leg} bulk sync (n=${entryCount})`,
|
|
164
|
+
});
|
|
165
|
+
const dtMs = performance.now() - t0;
|
|
166
|
+
if (sampler) {
|
|
167
|
+
clearInterval(sampler);
|
|
168
|
+
sampler = undefined;
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
dtMs,
|
|
172
|
+
entriesPerSecond: (entryCount / dtMs) * 1000,
|
|
173
|
+
mbPerSecond: ((entryCount * payloadSize) / (1024 * 1024) / dtMs) * 1000,
|
|
174
|
+
senderSendMs: sumProfile(events1, "simple.exchangeHeads", (event) => event.durationMs ?? 0),
|
|
175
|
+
counters: wireSyncOf(peer2)?.counters?.(),
|
|
176
|
+
maxStashLength,
|
|
177
|
+
deserializeFallbacks: sumProfile(events2, "sharedLog.rawReceive.deserializeFallback", () => 1),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
if (sampler) {
|
|
182
|
+
clearInterval(sampler);
|
|
183
|
+
}
|
|
184
|
+
await stopPair(pair);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
/**
|
|
188
|
+
* Native leg only. Seeds peer1, then holds peer2's pubsub `data` dispatch for
|
|
189
|
+
* the shared-log topic (frames >= the entry payload size, i.e. the raw
|
|
190
|
+
* exchange-head bulk frames; small control RPC passes through) while the
|
|
191
|
+
* burst arrives. The wire keeps decoding + stashing, so the stash crosses its
|
|
192
|
+
* FIFO caps and evicts. The held events are then replayed in arrival order:
|
|
193
|
+
* retained ids commit through the fused stash path, evicted ids fall back to
|
|
194
|
+
* the TS decode path. Convergence is asserted; the commit phase is timed.
|
|
195
|
+
*/
|
|
196
|
+
const stashPressureOnce = async (entryCount, payloadSize) => {
|
|
197
|
+
const pair = await openPair("native");
|
|
198
|
+
const { peer1, peer2, db1, db2, events2 } = pair;
|
|
199
|
+
const pubsub = peer2.services.pubsub;
|
|
200
|
+
const originalDispatch = pubsub.dispatchEvent.bind(peer2.services.pubsub);
|
|
201
|
+
let gateInstalled = false;
|
|
202
|
+
let sampler;
|
|
203
|
+
try {
|
|
204
|
+
for (let index = 0; index < entryCount; index++) {
|
|
205
|
+
await db1.add(makePayload(index, payloadSize), { meta: { next: [] } });
|
|
206
|
+
}
|
|
207
|
+
const wireSync = wireSyncOf(peer2);
|
|
208
|
+
if (!wireSync?.counters) {
|
|
209
|
+
throw new Error("native leg without a wire-sync session");
|
|
210
|
+
}
|
|
211
|
+
const topic = db2.log.rpc.topic;
|
|
212
|
+
const held = [];
|
|
213
|
+
let gateOpen = false;
|
|
214
|
+
pubsub.dispatchEvent = (event) => {
|
|
215
|
+
if (!gateOpen && event.type === "data") {
|
|
216
|
+
const detail = event.detail;
|
|
217
|
+
if (detail?.data?.topics?.includes(topic) &&
|
|
218
|
+
(detail.data.data?.byteLength ?? 0) >= payloadSize) {
|
|
219
|
+
held.push(event);
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return originalDispatch(event);
|
|
224
|
+
};
|
|
225
|
+
gateInstalled = true;
|
|
226
|
+
let maxStashLength = 0;
|
|
227
|
+
sampler = setInterval(() => {
|
|
228
|
+
const length = wireSync.stashLength;
|
|
229
|
+
if (typeof length === "number" && length > maxStashLength) {
|
|
230
|
+
maxStashLength = length;
|
|
231
|
+
}
|
|
232
|
+
}, 2);
|
|
233
|
+
await peer2.dial(peer1.getMultiaddrs());
|
|
234
|
+
const t0 = performance.now();
|
|
235
|
+
// hold until the burst has fully arrived: the stash-activity counter
|
|
236
|
+
// stops moving (all bulk frames are either stashed or evicted)
|
|
237
|
+
let lastStashed = -1;
|
|
238
|
+
let stableSince = performance.now();
|
|
239
|
+
await waitForResolved(() => {
|
|
240
|
+
const stashed = wireSync.counters().stashed;
|
|
241
|
+
const now = performance.now();
|
|
242
|
+
if (stashed !== lastStashed) {
|
|
243
|
+
lastStashed = stashed;
|
|
244
|
+
stableSince = now;
|
|
245
|
+
}
|
|
246
|
+
expect(stashed).to.be.greaterThan(0);
|
|
247
|
+
expect(now - stableSince).to.be.greaterThanOrEqual(500);
|
|
248
|
+
}, {
|
|
249
|
+
timeout: timeoutMs,
|
|
250
|
+
delayInterval: 100,
|
|
251
|
+
timeoutMessage: `stash pressure burst arrival (n=${entryCount})`,
|
|
252
|
+
});
|
|
253
|
+
const commitStart = performance.now();
|
|
254
|
+
gateOpen = true;
|
|
255
|
+
const heldFrames = held.length;
|
|
256
|
+
for (const event of held) {
|
|
257
|
+
originalDispatch(event);
|
|
258
|
+
}
|
|
259
|
+
pubsub.dispatchEvent = originalDispatch;
|
|
260
|
+
gateInstalled = false;
|
|
261
|
+
await waitForResolved(() => {
|
|
262
|
+
expect(db2.log.log.length).to.equal(entryCount);
|
|
263
|
+
}, {
|
|
264
|
+
timeout: timeoutMs,
|
|
265
|
+
delayInterval: 10,
|
|
266
|
+
timeoutMessage: `stash pressure convergence (n=${entryCount})`,
|
|
267
|
+
});
|
|
268
|
+
const tEnd = performance.now();
|
|
269
|
+
clearInterval(sampler);
|
|
270
|
+
sampler = undefined;
|
|
271
|
+
const commitDtMs = tEnd - commitStart;
|
|
272
|
+
const counters = wireSync.counters();
|
|
273
|
+
return {
|
|
274
|
+
totalDtMs: tEnd - t0,
|
|
275
|
+
commitDtMs,
|
|
276
|
+
entriesPerSecondCommit: (entryCount / commitDtMs) * 1000,
|
|
277
|
+
mbPerSecondCommit: ((entryCount * payloadSize) / (1024 * 1024) / commitDtMs) * 1000,
|
|
278
|
+
heldFrames,
|
|
279
|
+
stashed: counters.stashed,
|
|
280
|
+
evicted: counters.evicted,
|
|
281
|
+
maxStashLength,
|
|
282
|
+
deserializeFallbacks: sumProfile(events2, "sharedLog.rawReceive.deserializeFallback", () => 1),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
finally {
|
|
286
|
+
if (gateInstalled) {
|
|
287
|
+
pubsub.dispatchEvent = originalDispatch;
|
|
288
|
+
}
|
|
289
|
+
if (sampler) {
|
|
290
|
+
clearInterval(sampler);
|
|
291
|
+
}
|
|
292
|
+
await stopPair(pair);
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
const livePutsOnce = async (leg, putCount, payloadSize) => {
|
|
296
|
+
const pair = await openPair(leg);
|
|
297
|
+
const { peer1, peer2, db1, db2 } = pair;
|
|
298
|
+
let poller;
|
|
299
|
+
try {
|
|
300
|
+
await peer2.dial(peer1.getMultiaddrs());
|
|
301
|
+
await db1.log.waitForReplicator(peer2.identity.publicKey, {
|
|
302
|
+
timeout: timeoutMs,
|
|
303
|
+
});
|
|
304
|
+
await db2.log.waitForReplicator(peer1.identity.publicKey, {
|
|
305
|
+
timeout: timeoutMs,
|
|
306
|
+
});
|
|
307
|
+
// warm the path so the first measured put does not pay one-time costs
|
|
308
|
+
await db1.add(makePayload(0, payloadSize), { meta: { next: [] } });
|
|
309
|
+
await waitForResolved(() => {
|
|
310
|
+
expect(db2.log.log.length).to.equal(1);
|
|
311
|
+
}, { timeout: timeoutMs, timeoutMessage: `${leg} live-puts warm put` });
|
|
312
|
+
const baseline = db2.log.log.length;
|
|
313
|
+
const putStart = new Array(putCount);
|
|
314
|
+
const putResolved = new Array(putCount);
|
|
315
|
+
const visibleAt = new Array(putCount);
|
|
316
|
+
let seen = 0;
|
|
317
|
+
const observe = () => {
|
|
318
|
+
const visible = Math.min(db2.log.log.length - baseline, putCount);
|
|
319
|
+
if (visible > seen) {
|
|
320
|
+
const now = performance.now();
|
|
321
|
+
while (seen < visible) {
|
|
322
|
+
visibleAt[seen++] = now;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
poller = setInterval(observe, 1);
|
|
327
|
+
for (let index = 0; index < putCount; index++) {
|
|
328
|
+
putStart[index] = performance.now();
|
|
329
|
+
await db1.add(makePayload(index + 1, payloadSize), {
|
|
330
|
+
meta: { next: [] },
|
|
331
|
+
});
|
|
332
|
+
putResolved[index] = performance.now();
|
|
333
|
+
}
|
|
334
|
+
await waitForResolved(() => {
|
|
335
|
+
observe();
|
|
336
|
+
expect(seen).to.equal(putCount);
|
|
337
|
+
}, {
|
|
338
|
+
timeout: timeoutMs,
|
|
339
|
+
delayInterval: 5,
|
|
340
|
+
timeoutMessage: `${leg} live puts convergence (n=${putCount})`,
|
|
341
|
+
});
|
|
342
|
+
clearInterval(poller);
|
|
343
|
+
poller = undefined;
|
|
344
|
+
const latencies = visibleAt.map((visible, index) => {
|
|
345
|
+
return visible - putStart[index];
|
|
346
|
+
});
|
|
347
|
+
const addDurations = putResolved.map((resolved, index) => resolved - putStart[index]);
|
|
348
|
+
const wallMs = visibleAt[putCount - 1] - putStart[0];
|
|
349
|
+
return {
|
|
350
|
+
putsPerSecond: (putCount / wallMs) * 1000,
|
|
351
|
+
latencyP50Ms: percentile(latencies, 50),
|
|
352
|
+
latencyP95Ms: percentile(latencies, 95),
|
|
353
|
+
latencyMeanMs: mean(latencies),
|
|
354
|
+
addMeanMs: mean(addDurations),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
finally {
|
|
358
|
+
if (poller) {
|
|
359
|
+
clearInterval(poller);
|
|
360
|
+
}
|
|
361
|
+
await stopPair(pair);
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
const tasks = [];
|
|
365
|
+
const collect = async (name, runOnce, units, describe) => {
|
|
366
|
+
console.error(`# ${name}: ${warmupRuns} warmup + ${measuredRuns} measured`);
|
|
367
|
+
for (let index = 0; index < warmupRuns; index++) {
|
|
368
|
+
await runOnce();
|
|
369
|
+
console.error(` warmup ${index + 1}/${warmupRuns} done`);
|
|
370
|
+
}
|
|
371
|
+
const samplesByMetric = {};
|
|
372
|
+
for (let index = 0; index < measuredRuns; index++) {
|
|
373
|
+
const result = await runOnce();
|
|
374
|
+
for (const [key, value] of Object.entries(result)) {
|
|
375
|
+
(samplesByMetric[key] ??= []).push(value);
|
|
376
|
+
}
|
|
377
|
+
console.error(` run ${index + 1}/${measuredRuns} done`);
|
|
378
|
+
}
|
|
379
|
+
const metrics = {};
|
|
380
|
+
for (const [key, samples] of Object.entries(samplesByMetric)) {
|
|
381
|
+
metrics[key] = {
|
|
382
|
+
mean: mean(samples),
|
|
383
|
+
stdev: stdev(samples),
|
|
384
|
+
unit: units[key] ?? "",
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
tasks.push({
|
|
388
|
+
name,
|
|
389
|
+
samples: measuredRuns,
|
|
390
|
+
metrics,
|
|
391
|
+
notes: describe?.(samplesByMetric),
|
|
392
|
+
});
|
|
393
|
+
};
|
|
394
|
+
for (const scenario of scenarios) {
|
|
395
|
+
if (scenario === "cold-sync") {
|
|
396
|
+
for (const leg of legs) {
|
|
397
|
+
await collect(`cold-sync/${leg} (n=${coldCount}, payload=${coldPayload}B)`, async () => {
|
|
398
|
+
const result = await bulkSyncOnce(leg, coldCount, coldPayload);
|
|
399
|
+
return {
|
|
400
|
+
dtMs: result.dtMs,
|
|
401
|
+
entriesPerSecond: result.entriesPerSecond,
|
|
402
|
+
mbPerSecond: result.mbPerSecond,
|
|
403
|
+
senderSendMs: result.senderSendMs,
|
|
404
|
+
senderSendShare: result.dtMs > 0 ? result.senderSendMs / result.dtMs : 0,
|
|
405
|
+
evicted: result.counters?.evicted ?? 0,
|
|
406
|
+
deserializeFallbacks: result.deserializeFallbacks,
|
|
407
|
+
};
|
|
408
|
+
}, {
|
|
409
|
+
dtMs: "ms",
|
|
410
|
+
entriesPerSecond: "entries/s",
|
|
411
|
+
mbPerSecond: "MB/s",
|
|
412
|
+
senderSendMs: "ms",
|
|
413
|
+
senderSendShare: "of wall",
|
|
414
|
+
evicted: "msgs",
|
|
415
|
+
deserializeFallbacks: "msgs",
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
else if (scenario === "live-puts") {
|
|
420
|
+
for (const leg of legs) {
|
|
421
|
+
await collect(`live-puts/${leg} (n=${liveCount}, payload=${livePayload}B)`, async () => {
|
|
422
|
+
const result = await livePutsOnce(leg, liveCount, livePayload);
|
|
423
|
+
return { ...result };
|
|
424
|
+
}, {
|
|
425
|
+
putsPerSecond: "puts/s",
|
|
426
|
+
latencyP50Ms: "ms",
|
|
427
|
+
latencyP95Ms: "ms",
|
|
428
|
+
latencyMeanMs: "ms",
|
|
429
|
+
addMeanMs: "ms",
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
// stash-pressure runs only on the native leg: the FIFO caps are a
|
|
435
|
+
// property of the wire-sync stash
|
|
436
|
+
if (!legs.includes("native")) {
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
for (const [label, count] of [
|
|
440
|
+
["below-cap", stashBelowCount],
|
|
441
|
+
["above-cap", stashAboveCount],
|
|
442
|
+
]) {
|
|
443
|
+
const totalMb = (count * stashPayload) / (1024 * 1024);
|
|
444
|
+
await collect(`stash-pressure/native ${label} (n=${count}, payload=${stashPayload}B, ~${fmt(totalMb, 0)}MB)`,
|
|
445
|
+
// convergence is asserted inside stashPressureOnce; evicted
|
|
446
|
+
// stash entries must have been recovered by the TS fallback
|
|
447
|
+
// decode for the run to get here
|
|
448
|
+
() => stashPressureOnce(count, stashPayload), {
|
|
449
|
+
totalDtMs: "ms",
|
|
450
|
+
commitDtMs: "ms",
|
|
451
|
+
entriesPerSecondCommit: "entries/s",
|
|
452
|
+
mbPerSecondCommit: "MB/s",
|
|
453
|
+
heldFrames: "msgs",
|
|
454
|
+
stashed: "msgs",
|
|
455
|
+
evicted: "msgs",
|
|
456
|
+
maxStashLength: "msgs",
|
|
457
|
+
deserializeFallbacks: "msgs",
|
|
458
|
+
}, (samples) => label === "above-cap" && (samples.evicted ?? []).every((x) => x === 0)
|
|
459
|
+
? "warning: burst did not exceed the stash caps (no evictions observed)"
|
|
460
|
+
: "converged on every run");
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
if (process.env.BENCH_JSON === "1") {
|
|
465
|
+
process.stdout.write(JSON.stringify({
|
|
466
|
+
name: "shared-log-network-preset-e2e",
|
|
467
|
+
tasks,
|
|
468
|
+
meta: {
|
|
469
|
+
warmupRuns,
|
|
470
|
+
measuredRuns,
|
|
471
|
+
timeoutMs,
|
|
472
|
+
coldCount,
|
|
473
|
+
coldPayload,
|
|
474
|
+
liveCount,
|
|
475
|
+
livePayload,
|
|
476
|
+
stashPayload,
|
|
477
|
+
stashBelowCount,
|
|
478
|
+
stashAboveCount,
|
|
479
|
+
scenarios,
|
|
480
|
+
legs,
|
|
481
|
+
},
|
|
482
|
+
}, null, 2));
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
for (const task of tasks) {
|
|
486
|
+
console.log(`\n## ${task.name} (${task.samples} runs)`);
|
|
487
|
+
console.log("| metric | mean | stdev | unit |");
|
|
488
|
+
console.log("| --- | --- | --- | --- |");
|
|
489
|
+
for (const [key, metric] of Object.entries(task.metrics)) {
|
|
490
|
+
console.log(`| ${key} | ${fmt(metric.mean, 2)} | ${fmt(metric.stdev, 2)} | ${metric.unit} |`);
|
|
491
|
+
}
|
|
492
|
+
if (task.notes) {
|
|
493
|
+
console.log(`\n${task.notes}`);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
//# sourceMappingURL=network-preset-e2e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-preset-e2e.js","sourceRoot":"","sources":["../../benchmark/network-preset-e2e.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receive-prune.d.ts","sourceRoot":"","sources":["../../benchmark/receive-prune.ts"],"names":[],"mappings":""}
|