> Section: [11. Project](https://jaque.sh/docs/project/status.md)
> Next: project/roadmap
> Index: https://jaque.sh/llms.txt


These numbers come from soak runs of `scripts/bench.sh`, one cell per
row, read from the summary each run writes.

## Machine

| | |
|---|---|
| CPU(s) | 12 |
| Model | Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz |
| Cores / threads | 6 cores, 2 threads per core, 1 socket |
| Kernel | 7.1.10-200.fc44.x86_64 |

## Parameters

Every cell below shares these parameters:

- `soak_seconds`: 900
- `global_concurrency`: 50, `host_concurrency`: 4 (every host in the
  synthetic estate shares one address, so `host_concurrency` binds
  nothing here)
- `ticks_per_second`: 100
- harness: `just bench-matrix`

## Results

| cell | profile | objects | drift p50 (s) | drift p99 (s) | drift max (s) | queue depth max | checks executed | check timeouts | cpu % mean | memory peak (GiB) |
|---|---|---|---|---|---|---|---|---|---|---|
| tcp-1000 | tcp | 1000 | < 0.005 | < 0.005 | 0.005 | 1000 | 15016 | 0 | 3.4 | 0.09 |
| tcp-10000 | tcp | 10000 | < 0.005 | < 0.005 | 0.010 | 10000 | 150344 | 0 | 29.4 | 0.47 |
| tcp-50000 | tcp | 50000 | < 0.005 | < 0.005 | 0.100 | 49999 | 753205 | 0 | 91.6 | 2.22 |
| exec-1000 | exec | 1000 | < 0.005 | < 0.005 | 0.005 | 1000 | 15016 | 0 | 3.7 | 0.08 |
| exec-10000 | exec | 10000 | < 0.005 | < 0.005 | 0.010 | 10000 | 150378 | 0 | 34.6 | 0.51 |

All five cells are one run of the matrix, taken on 2026-09-20. Drift is
the gap between the moment a check was due and the moment it ran. It is
recorded in a histogram whose smallest bucket ends at 5 ms, and in every
cell both the median and the 99th percentile fall inside that bucket, so
the table says "under 5 ms" and no finer. The `drift max` column is the
upper edge of the highest bucket that received a sample. `cpu % mean` is
a percentage of one core, on a machine with twelve. `memory peak` is the
largest resident size the process reached during the soak.

## Compared

The same estate, 5000 hosts and 5000 services checked every 60 seconds
against one local listener, was run under four engines on the machine
above, one at a time, 900 seconds each. Every engine ran in a container
with the same limits and host networking, and every engine ran the same
`check_tcp` plugin from monitoring-plugins 2.3.3. The last row is jaque
running its built-in tcp check, which the others have no equivalent of,
so it is a second row and no part of the like-for-like comparison.

| engine | version | check | latency avg (s) | latency max (s) | checks executed | cpu % mean | memory peak (GiB) | memory stable (GiB) |
|---|---|---|---|---|---|---|---|---|
| Nagios Core | 4.4.6 | plugin | 0.0045 | 0.084 | 144918 | 81.8 | 0.34 | 0.03 |
| Naemon | 1.5.2 | plugin | 0.0010 | 0.015 | 150000 | 67.6 | 0.12 | 0.03 |
| Icinga 2 | 2.16.5 | plugin | 0.0007 | 0.017 | 153392 | 118.9 | 0.20 | 0.17 |
| jaque | v0.3.204 | plugin | 0.0005 | 0.010 | 155754 | 102.6 | 0.68 | 0.19 |
| jaque | v0.3.204 | built-in | 0.0005 | 0.010 | 155883 | 24.5 | 0.47 | 0.16 |

Latency is the gap between the moment a check was due and the moment it
ran, as each engine reports it: `nagios4stats` and `naemonstats` for the
first two, the status API for Icinga 2, the drift histogram for jaque.
Nagios Core and Naemon publish a minimum, an average and a maximum and
no percentiles, so the table compares averages. jaque's 99th percentile
in both rows was under 5 ms. `cpu % mean` is a percentage of one core
and covers everything in the container, the plugin processes included.
`memory peak` is the largest figure sampled, which for every engine
falls while it reads its configuration. `memory stable` is the mean of
the last five minutes.

Read row by row: on scheduling latency Naemon, Icinga 2 and jaque are
within a millisecond of each other and Nagios Core is a few milliseconds
behind. Running the plugin, Naemon uses the least processor time and
jaque sits between Nagios Core and Icinga 2. Nagios Core and Naemon hold
far less memory than jaque once loaded, about 35 MiB against 190 MiB,
and jaque's peak while loading is the highest of the four. With the
built-in check jaque uses about a quarter of the processor time of the
lightest plugin row, because no process is started per check.

The container definitions, each engine's tuned configuration and the
estate generator are in `contrib/bench-compare/` and
`scripts/bench-compare.sh` runs one cell.

## Reproducing a cell

```
scripts/bench.sh <profile> <objects> [soak_seconds]
```

`profile` is `tcp` or `exec`, `objects` is a positive even integer (half
hosts, half services), and `soak_seconds` defaults to 900. `just
bench-matrix` runs the baseline matrix in sequence.
