Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,18 @@ It builds on a baseline that simulates the sort of device you might be adding th
measures itself: see [docs/baseline.md](docs/baseline.md) for what the baseline is, how the
figures are made, and how to run it.

## This stage — Larger cap
## This stage — Smaller ring

The message cap doubles to 512 bytes. Three SD-ELEMENTs had already taken a short record close to
the old ceiling, and the two counters it carries are 32-bit — at full width the same record would
cross it and start truncating.
The ring holds four records instead of eight. It is sized in records, so doubling the cap doubled
what it cost — and four is enough to absorb what gets logged while the service task is sending,
because the store rather than the ring is what holds a backlog.

The cost is almost all RAM, because the cap sizes three things at once: the ring, the store's
record buffer, and the deepest single demand the formatter makes of whichever task calls it.
It gives back almost everything the cap rise took. Nothing else moves: the ring bounds how many
records can be in flight, not how large one may be.

<!-- STAGE-COST:START (generated by scripts/gen-cost-table.py — do not edit by hand) -->

**Cost above baseline: Flash +11,980 B, RAM +9,440 B.**
**Cost above baseline: Flash +11,980 B, RAM +7,384 B.**

<!-- STAGE-COST:END -->

Expand All @@ -48,6 +48,7 @@ committed as [`run-report.md`](run-report.md), and rewritten by every stage.
| File store | records that survive a failed send, spooled to disk with a checksum at rest | +11,576 | +7,092 |
| Origin | the device named in the record itself, not inferred from the source address | +11,972 | +7,136 |
| Larger cap | headroom for the grown record, so full-width counters cannot push it into truncation | +11,980 | +9,440 |
| Smaller ring | most of the cap rise given back, now the store rather than the ring holds a backlog | +11,980 | +7,384 |

*Deltas are bytes above the baseline, which is itself Flash 350,308 B, RAM 111,192 B.*

Expand Down
7 changes: 4 additions & 3 deletions app/syslog/Syslog.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,10 @@
#define SYSLOG_COLLECTOR_HOST "10.0.2.2"
#define SYSLOG_COLLECTOR_PORT ((uint16_t) 5601U)

/* Depth enough to absorb a burst while the sender is busy, without sizing for a
* backlog the store is there to hold. */
#define SYSLOG_BUFFER_RECORDS 8U
/* Absorbs records logged while the service task is busy sending. Many devices can
* reduce this further: the store holds the backlog, so the ring only has to cover
* a burst. */
#define SYSLOG_BUFFER_RECORDS 4U

/* One "<prefix>NN.log" per block, on the volume the device already mounts. */
#define SYSLOG_STORE_PREFIX "syslog"
Expand Down
13 changes: 13 additions & 0 deletions measurements/buffer-halve.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# buffer-halve figures (bytes) — captured by scripts/run.sh (CAPTURE=1).
# The device reads measurements/Baseline.csv as its frozen baseline and reports current-minus-Baseline.
flash_text,361648
flash_data,640
static_bss,117936
heap_used,4440
mbedtls_peak,21340
mbedtls_free,11428
lwip_mem_free,7576
lwip_pbufs_free,13
stack_log,824
stack_service,1044
stack_harness,2848
1 change: 1 addition & 0 deletions measurements/stages.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,4 @@ time-quality Time quality a timestamp the collector knows how far to trust, and
file-store File store records that survive a failed send, spooled to disk with a checksum at rest
origin Origin the device named in the record itself, not inferred from the source address
cap-rise Larger cap headroom for the grown record, so full-width counters cannot push it into truncation
buffer-halve Smaller ring most of the cap rise given back, now the store rather than the ring holds a backlog
26 changes: 13 additions & 13 deletions run-report.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# solid-syslog-example — run (cap-rise)
# solid-syslog-example — run (buffer-halve)

## Device (self-measured)

Expand All @@ -12,12 +12,12 @@
[report] key,current,baseline,used_above_baseline
[report] flash_text,361648,349992,11656
[report] flash_data,640,316,324
[report] static_bss,119992,110876,9116
[report] static_bss,117936,110876,7060
[report] heap_used,4440,4440,0
[report] mbedtls_peak,21332,21332,0
[report] mbedtls_free,11436,11436,0
[report] mbedtls_peak,21340,21332,8
[report] mbedtls_free,11428,11436,-8
[report] lwip_mem_free,7576,7576,0
[report] lwip_pbufs_free,14,14,0
[report] lwip_pbufs_free,13,14,-1
[report] stack_log,824,120,704
[report] stack_service,1044,52,992
[report] stack_harness,2848,2840,8
Expand All @@ -29,7 +29,7 @@

```text
text data bss dec hex filename
361640 648 119992 482280 75be8 /w/build/baseline-cross/baseline.elf
361640 648 117936 480224 753e0 /w/build/baseline-cross/baseline.elf
```

## Listeners (proved before the device ran)
Expand All @@ -47,21 +47,21 @@
## Collector (syslog-ng) received

```text
wire <134>1 2026-07-29T08:25:48.280000Z 10.0.2.15 solid-syslog-example - BOOT [meta sequenceId="1" sysUpTime="228"][timeQuality tzKnown="1" isSynced="0"][origin software="solid-syslog-example" swVersion="0.1.0" enterpriseId="32473"] device started
parsed PRIORITY=134 TIMESTAMP=2026-07-29T08:25:48+00:00 HOSTNAME=10.0.2.15 APP_NAME=solid-syslog-example PROCID= MSGID=BOOT STRUCTURED_DATA=[meta sequenceId="1" sysUpTime="228"][timeQuality tzKnown="1" isSynced="0"][origin software="solid-syslog-example" swVersion="0.1.0" enterpriseId="32473"] MSG=device started
wire <134>1 2026-07-29T08:29:37.410000Z 10.0.2.15 solid-syslog-example - BOOT [meta sequenceId="1" sysUpTime="241"][timeQuality tzKnown="1" isSynced="0"][origin software="solid-syslog-example" swVersion="0.1.0" enterpriseId="32473"] device started
parsed PRIORITY=134 TIMESTAMP=2026-07-29T08:29:37+00:00 HOSTNAME=10.0.2.15 APP_NAME=solid-syslog-example PROCID= MSGID=BOOT STRUCTURED_DATA=[meta sequenceId="1" sysUpTime="241"][timeQuality tzKnown="1" isSynced="0"][origin software="solid-syslog-example" swVersion="0.1.0" enterpriseId="32473"] MSG=device started
```

## Self-check (vs measurements/cap-rise.csv)
## Self-check (vs measurements/buffer-halve.csv)

```text
OK flash_text: 361648 (expected 361648, Δ0)
OK flash_data: 640 (expected 640, Δ0)
OK static_bss: 119992 (expected 119992, Δ0)
OK static_bss: 117936 (expected 117936, Δ0)
OK heap_used: 4440 (expected 4440, Δ0)
OK mbedtls_peak: 21332 (expected 21332, Δ0)
OK mbedtls_free: 11436 (expected 11436, Δ0)
OK mbedtls_peak: 21340 (expected 21340, Δ0)
OK mbedtls_free: 11428 (expected 11428, Δ0)
OK lwip_mem_free: 7576 (expected 7576, Δ0)
OK lwip_pbufs_free: 14 (expected 14, Δ0)
OK lwip_pbufs_free: 13 (expected 13, Δ0)
OK stack_log: 824 (expected 824, Δ0)
OK stack_service: 1044 (expected 1044, Δ0)
OK stack_harness: 2848 (expected 2848, Δ0)
Expand Down
Loading