One host, one run
A capped scan of a synthetic fixture.
Synthetic fixture. Not a customer and not a sample of anyone's files.
- File-cache residency of the fixture was cleared.
- Disk-cold was not established.
- A page-cache-warm scan was not achieved.
This is one run of an identified binary on one VPS. It is not a benchmark, not a median, and not a list of filesystems Leita supports. The runner stored two reports in files named cold.json and warm.json. Those are phase labels. They are not measurements of a cold cache or a warm cache.
What ran
leita gc9f3469 (linux/amd64, built 2026-10-14), sha256 2db0b50fdecd3b955f72b936003724a340efd76563d709f03f17a9dc40ee4b1c. The copy is a local build placed in the work directory, not a release asset. No licence was loaded. generator.licensee is null. Each report ends with: Unlicensed copy made during the 30-day trial.
The host is host1, NixOS 26.05 (Yarara), Linux 6.18.52, x86_64, one CPU. host.txt shows MemTotal 987260 kB, MemAvailable 597528 kB, and no swap. The fixture's mount is /dev/vda3 ext4. /dev/vda is 53687091200 bytes and the kernel reports ROTA=1. This page does not call that disk an SSD or a hard drive. Leita's filesystem field on every report is other. Leita did not identify ext4. No other filesystem was scanned.
The host glibc banner is GNU C Library (GNU libc) stable release version 2.42. Running the binary directly exited 127. The host loader is the NixOS stub and refused it. The scan was started with a private loader copied into the work directory:
$work/glibc/ld-linux-x86-64.so.2 --library-path $work/glibc $work/leita
The three files' sha256 values are in host.txt. They match the operator machine's /usr/lib64/ld-linux-x86-64.so.2, /usr/lib/libc.so.6, and /usr/lib/libm.so.6. Executing that libc.so.6 on the operator machine printed GNU C Library (GNU libc) stable release version 2.44. The VPS did not print that banner. host.txt records cannot execute: required file not found for a direct exec of the copied libc.so.6, because its interpreter on the VPS is the stub. The binary itself was not modified. This is not a measurement of the host's glibc and not a NixOS-native build.
Every phase ran in a transient systemd unit. The live cgroup files record memory.max 134217728, memory.swap.max 0, cpu.max 25000 100000 (25%), and io.max 253:0 rbps=8388608 wbps=8388608 on /dev/vda. TasksMax=64 was requested on every unit and is visible in raw/monon.unit, the unit that stayed loaded because it failed. The successful units were gone before systemctl show, so their .unit files say infinity. Those files are not the cap. The cgroup files are.
Fixture and the change
Seed 615-vps-1. Four files, under /tmp/leita615.1792594508/fixture. Three are 1,048,576 NUL bytes. note/label.txt is 4,096 bytes. The runner writes the disclosure, the seed, and NUL padding into that label. This publish does not include a copy of the label. The report counts it as the one text file, 4,096 bytes.
The first report totals 3,149,824 bytes, 4 files, and 4 directories. That is three 1,048,576-byte files plus the label. Between the history scans the runner appended 1,048,576 NUL bytes to grow.bin, deleted drop.bin, and created new/new.bin at 1,048,576 NUL bytes. The empty drop directory stayed. The later report totals 4,198,400 bytes, 4 files, and 5 directories.
| File | Before (bytes) | After (bytes) | Change |
|---|---|---|---|
| keep.bin | 1,048,576 | 1,048,576 | 0 |
| grow.bin | 1,048,576 | 2,097,152 | +1,048,576 |
| drop.bin | 1,048,576 | removed | absent from the report |
| new.bin | absent | 1,048,576 | empty |
| label.txt | 4,096 | 4,096 | empty |
The comparison JSON checks out against that arithmetic. grow.bin change is 1,048,576. keep.bin change is 0. new.bin has bytes_before and change null, which is what this build writes for a new file. label.txt is under 1 MiB, and this build leaves change empty for an entry that small; the scan still counts the 4,096 bytes. drop.bin is not in the later largest-file list. The text summary says “up 1.0 MiB since 2026-10-21 14:55, from 3.0 MiB”. That “from 3.0 MiB” rounds. compared.bytes in the JSON is 3,149,824.
The HTML file is a separate --no-history --whole scan of the mutated tree. It is not the comparison. It carries the same trial sentence.
Cache, and what was not shown
File-cache residency of the fixture was cleared before the first scan. The method was per-file fsync (syscall 74) and then posix_fadvise POSIX_FADV_DONTNEED (fadvise64 syscall 221, advice 4). The verifier is util-linux fincore -b, RES in bytes. Global drop_caches was not used. Directory and inode caches were not dropped. The hypervisor and the device cache were not bypassed.
fincore reported 0 resident bytes for every fixture file before the first scan, after it, before the repeat, and after the repeat. Before the history scan of the mutated tree, the four remaining files were also at 0, including keep.bin and the label, which were not advised again. grow.bin was 2,097,152 bytes and still not resident. A page-cache-warm scan was not achieved. The repeat is a second unbuffered scan of files that were still not resident.
Disk-cold was not established. During the first scan unit, /proc/diskstats for vda moved by 1 completed read and 8 sectors, and by no writes. The kernel's diskstats sector is defined as 512 bytes, so that counter moved 4,096 bytes, not the fixture's 3,149,824. This run did not measure the device's physical sector size. Another process on the host can move the counter. The scan's own cgroup recorded no read. A /proc/diskstats delta is not proof the device served the fixture.
A directory walk can report names and sizes from metadata and not read the file bytes. This run fits that, and it was not arranged as a separate proof.
- Leita printed
Other, Rotational media, Walk engine, Unbuffered ioand1 readers at Gentle pace, andread in 0 ms. The report duration isPT0.000S. - After the scan,
fincorestill showed 0 resident bytes. A read through the page cache would have left the file pages resident. - The first scan's cgroup
io.statis253:0 ;, with no byte counters. The repeat and the HTML scan are the same. The history scans recorded writes and no reads: 98,304 bytes written on the baseline unit and 24,576 on the incremental unit. - The version unit, which only printed
--version, recordedrbytes=4096. This cgroup did account a read when one happened. The scan units did not record one. - An unbuffered read of the file bytes would still have to move the device counter by about the size of the fixture. The counter moved 4,096 bytes.
So this run did not show a read of the fixture's file bytes. A scan does not necessarily read file data. That is this fixture of NUL files, on this build, in this run. It does not say that every Leita scan skips file contents.
Leita's later summary says “updated: 6 directories read again since 2026-10-21 14:55 (folder times)”. That sentence is about directory times. The cgroup for that unit recorded no read bytes.
The two unbuffered reports agree except space.free: 45,670,916,096 then 45,670,879,232. Totals, duration, and the file list do not differ. This page does not assign a cause to the 36,864-byte change in free space.
Time and memory
Three clocks, each quoted as printed. Leita's duration is PT0.000S and the text says read in 0 ms. GNU time wraps the Leita process. systemd's service runtime wraps the shell, GNU time, and Leita. One sample each. Not a ranking against other tools.
| Runner file | What the command was | GNU elapsed | GNU max RSS | cgroup memory.peak | Unit runtime | Unit CPU |
|---|---|---|---|---|---|---|
| cold.json | first --no-history --whole scan | 0.00 s | 3440 KiB | 2097152 | 77ms | 33ms |
| warm.json | the same command again | 0.00 s | 3440 KiB | 2097152 | 103ms | 30ms |
| baseline.json | first history scan, without --whole | 0.03 s | 5128 KiB | 2097152 | 86ms | 30ms |
| incremental.json | history scan after the mutation | 0.01 s | 4864 KiB | 2097152 | 68ms | 27ms |
| incremental.html | separate --no-history --whole HTML scan | 0.00 s | 3440 KiB | 2097152 | 84ms | 29ms |
GNU time's max_rss_kb and the cgroup's memory.peak are different instruments. 3440 KiB is not 2,097,152 bytes. Both are printed above. systemd's “Memory peak: 2M” matches the cgroup peak on these five units. The failed monitor unit peaked at 2,318,336 bytes. User and system time in GNU time printed 0.00 on every phase. Exit status was 0 on every scan. monitor on exited 1.
An externally scheduled scan
A second synthetic fixture was scanned by a transient systemd timer on the same VPS, using the same identified binary and private loader. The timer was armed at 2026-10-21T16:54:41Z with --on-active=3s; the journal and report record the scan starting at 2026-10-21T16:54:44Z. This verifies external scheduling. Leita’s own monitor on remains unverified.
The service’s cgroup, captured immediately before executing Leita, recorded a 128 MiB memory limit, no swap, a 25% CPU quota, 64 tasks, and read/write limits of 8 MiB/s on /dev/vda. Its before-start properties recorded a 20 s runtime limit. The timer and service were transient; no persistent unit was installed.
The fixture contained a 1,048,576-byte NUL file and a 165-byte synthetic label occupying 4,096 bytes. Leita returned exit 0 and reported 1,052,672 bytes across 2 files, matching the sum of allocated bytes from stat. Apparent bytes totalled 1,048,741. The report’s duration was PT0.000S; this is one operational check, not a throughput measurement.
Scheduled JSON report · Fixture truth · Armed timer · Service properties before start · Live cgroup limits · Journal · Exact command · Wrapper · Exit status · Cleanup check.
The units were collected after the scan. Post-collection defaults do not describe the running service’s caps; use the before-start and live records above. Cleanup removed the temporary fixture and state, and the follow-up check found no persistent timer or Leita state under the root user’s home.
Schedule and what is unsupported
The first experiment produced headless JSON and HTML. The second experiment verified one externally scheduled scan, as recorded above. journal on was not run. Grafana is unavailable. This run produced no Prometheus textfile, and this page has no Grafana image.
| Capability | What this run showed |
|---|---|
| JSON report of a directory | Exit 0. Schema leita.report/1. Filesystem field other. |
| HTML report | Exit 0, from a separate --no-history --whole invocation. Trial footer present. |
| History comparison | Exit 0, history under the work directory's XDG_DATA_HOME. grow.bin +1,048,576. keep.bin change 0. |
| Journal recording | Not started. Status: “not recording changes; sudo leita journal on starts the recorder”. |
monitor add | Recorded an hourly watch and printed that monitoring is off. |
monitor on | Failed, exit 1: “cannot add the systemd user timer leita-monitor.timer” because systemctl --user daemon-reload failed. The isolation stub refused that command. The stub log is two lines, both --user daemon-reload. No timer was installed. |
monitor run --all | “monitoring is off: nothing to do”. |
| An externally scheduled scan | Transient systemd timer fired after 3 s. Exit 0; 1,052,672 allocated bytes across 2 files, matching fixture truth. Leita-native scheduling remains unverified. |
| Grafana | Unavailable. No textfile and no image. |
| Filesystems | This mount is ext4. Leita said other. Nothing else was scanned. |
| Machines | This host only. |
Commands
Each of these followed the private loader above, inside the capped unit, with HOME and every XDG_* directory under the work directory. --color never and --gentle were set on the scans. --top 20 too.
leita --gentle --color never --no-history --whole --top 20 --report cold.json --format json $fixture
leita --gentle --color never --no-history --whole --top 20 --report warm.json --format json $fixture
leita --gentle --color never --top 20 --report baseline.json --format json $fixture
leita --gentle --color never --top 20 --report incremental.json --format json $fixture
leita --gentle --color never --no-history --whole --top 20 --report incremental.html --format html $fixture
leita journal status
leita monitor list
leita monitor add $fixture --every hourly
leita monitor on
leita monitor run --all
journal on was not run. monitor on had stub systemctl and loginctl first on PATH. The mutation was appending 1,048,576 zero bytes to grow.bin, deleting drop.bin, and creating new.bin the same size, then fsync and fadvise on those two files only.
Downloads
First report, cold.json. Repeat report, warm.json. History baseline. Comparison JSON. HTML report. Runner results.json. Assembled measurements. Host snapshot. Direct-exec refusal. Stub log. GNU time for the first scan. Cgroup for the first scan. fincore before the first scan. The runner.
raw/ holds the GNU time, cgroup, systemd, summary, and fincore files for every phase the runner named: version, cold, warm, base, incr, html, journal, monlist, monadd, monon, monrun. measurements.json was assembled afterwards from those files. Leita did not write it.
Reproduce
On the host, as root, with systemd-run, perl, fincore, jq, and GNU time at /run/current-system/sw/bin/time:
run.sh /tmp/leita615.A-NEW-NAME /path/to/leita /path/to/glibc
The work directory must match /tmp/leita615.* and must not already exist. glibc must contain ld-linux-x86-64.so.2, libc.so.6, and libm.so.6. The binary must match the sha256 above. The script refuses to start when Leita state or a Leita unit already exists outside the work directory, when MemAvailable is below 200000 kB, when load is at least 1.5, or when /tmp has under 1 GiB free. It does not drop the global page cache, send mail, reboot, or run journal on. The output filenames include cold.json and warm.json. Read the cache section before treating those names as cache conditions.
The files on this page are the run whose work directory was /tmp/leita615.1792594508. The script wrote results.json only after its check that no Leita state had appeared outside that directory. Repeating the script needs a new work-directory name. This page does not deploy it.