Measurements of an eight-hour Windows protocol-plane soak

Test date 7 September 2026 · research report

This report gives the results of one continuous eight-hour test. A Node client sent frames to the Sync daemon over the WebSocket protocol on one Windows computer. The test measured daemon memory and the rate of frames the daemon accepted.

The test used no browser and no camera. It did not look at picture content. Read the Limitations section before you use these numbers. Several things that a reader can expect from a performance report were not measured here.

Configuration and method

What ran

ItemValue
HarnessSync repository, commit 2fd56ec, test/soak/run.mjs
DaemonBuilt from source at commit 2fd56ec with MSVC 19.44 and vcpkg on the test computer. The daemon source is identical to the 0.2.56 release commit: native/ and CMakeLists.txt do not change between b0ecb9f and 2fd56ec. This is not the released 0.2.56 binary, which a different toolchain built.
Publisher mode--test-receiver. The daemon used its test publisher. No camera, Syphon, Spout or NDI publisher ran.
ClientNode protocol client on a raw WebSocket. No browser, no renderer, no GPU readback.
Frame size1920 × 1080, constant. The test made no geometry changes.
Frame pacingNone. The client sent frames as fast as the connection accepted them.
Sender cycle60 s. The client closed and made a new sender every 60 s.
Duration28 800 s (8 h), from 04:20 to 12:20 UTC
SamplingEvery 1 s
Nodev24.14.1
Operating systemWindows 11 Home, version 25H2, build 26200.9278
ProcessorIntel Core i7-12700F, 12 cores, 20 logical processors
Memory15.8 GB

How the daemon was measured

The harness read two Windows counters for the daemon process once each second: PrivateMemorySize64 (shown as private bytes, or footprint) and WorkingSet64 (shown as RSS). Frame counts come from the daemon's own accepted counter, read through the control protocol.

No other job ran on the computer during the test. A sidecar recorded the state of the continuous-integration runner on the same computer every 5 s: it found no active job at any point in the eight hours. Host processor use stayed at a median of 10.6 % and a 95th percentile of 15.4 %, which is the test itself.

Measurement results

Totals

MeasurementValue
Accepted frames766 527
Sender cycles completed480
Dropped frames0
Reconnects0
Error records0
Samples recorded28 800
Missing samples0

The sample series has no discontinuity. Every second from 1 to 28 800 has one sample, and no sample has a null memory reading.

Daemon memory

CounterFirstLastMaximumChange
Private bytes (KiB)11 25611 14011 2600
Working set (KiB)20 42420 42020 448−4

The reported growth is 0 KiB. The harness computes growth from the median of the first five and the last five samples of the measured window, which prevents one unusual sample at either end from setting the result. Two other calculations agree: an independent median calculation and the raw first-to-last difference both give 0 KiB.

Private bytes stayed between 11 128 and 11 260 KiB for the whole test, apart from 27 samples described in Dips. The daemon made and released 480 senders in this window and did not keep memory across them.

Rate of accepted frames

MeasurementValue
Mean over the test26.6 frames per second
Lowest five-minute bucket25.6
Highest five-minute bucket28.2
Lowest one-second sample1
Highest one-second sample39

This rate is not a target. Nothing limited the frame rate, so the number shows how fast this client, this daemon and this computer moved frames together. It is not a property of the daemon alone. See Limitations.

Accepted frames per second in five-minute buckets across eight hours. The mean line stays between about 25.6 and 28.2. A lighter band shows the minimum and maximum one-second values in each bucket, which reach down to 1 and up to 39.
Figure 1. Accepted frames per second, five-minute buckets, across the eight hours. The dark line is the bucket mean. The light band is the minimum and maximum one-second value inside each bucket; its lower edge shows the sender cycle boundaries. The y axis starts at zero.
Daemon private bytes and working set sampled each minute across eight hours. Both lines are flat. Private bytes sits near 11,140 kibibytes and the working set near 20,420 kibibytes. Twenty-seven marked points drop to about 3,016 kibibytes.
Figure 2. Daemon private bytes and working set, sampled each minute, on one shared scale. Both counters are flat for the full eight hours. The marked points are the 27 samples that fell at a sender cycle boundary; they are kept in the figure, not removed. The y axis starts at zero.
Sender cycles completed rise in a straight line from zero to 480 across eight hours. Dropped frames and reconnects stay at zero for the whole test.
Figure 3. Sender cycles completed against elapsed time, with dropped frames and reconnects. The cycle line is straight, which shows the 60 s cycle held for the full test. Dropped frames and reconnects are zero everywhere and lie on the axis.

Dips and boundary samples

27 of the 28 800 memory samples (0.094 %) read about 3 016 KiB instead of about 11 140 KiB. These are real readings, and this report does not remove them.

Their cause is known. Each one falls in the short window when the client has closed one sender and has not yet opened the next, so the daemon has released the buffers for that sender. The seconds at which they occur move steadily through the 60 s cycle: the offset from the cycle boundary goes from 1 s to 10 s across the eight hours, because the 1 s sampler and the 60 s cycle drift against each other. A longer test always meets this condition again.

The same effect explains the lowest one-second frame counts. A second in which the sender closes and reopens carries fewer frames than a second of steady streaming.

Limitations

These results do not establish the performance of the released product. The following limits apply.

What this test does show. Over eight hours and 480 sender cycles, with 766 527 frames accepted, the daemon's private bytes did not grow, and the harness recorded no dropped frame, no reconnect and no error. That is a statement about memory behaviour on the protocol path on this operating system, and nothing more.

Provenance

ItemValue
Harness revisionSync repository commit 2fd56ec
Daemon sourceSame commit. Identical to the 0.2.56 release commit for native/ and CMakeLists.txt.
Daemon buildMSVC 19.44, vcpkg, Release, on the test computer
Nodev24.14.1
Test window2026-09-07, 04:20 to 12:20 UTC
Raw seriesmetrics.json

metrics.json holds the five-minute buckets, the per-minute resource series, and every one of the 27 boundary samples, so a reader can repeat the calculations in this report. SHA256SUMS in this directory gives a SHA-256 hash for every file.