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: 900global_concurrency: 50,host_concurrency: 4 (every host in the synthetic estate shares one address, sohost_concurrencybinds 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.