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.