tirnix

Linux monitoring and diagnostics · terminal UI

CPU at 100 %. Tirnix tells you why, and how to check.


It shows that the load stayed high for 30 seconds, which processes did it, what usually causes that and which commands confirm it, while keeping measured facts and guesses apart. One 1.5 MB static binary. No root, no daemon, no telemetry.

  • Latest0.2.0
  • Binary~1.5 MB, static (musl)
  • Archx86_64 · aarch64
  • Packages.deb · .rpm
  • LicenseGPL-3.0-or-later
ssh web01 · tirnix report
$ tirnix report
CPU      100% busy (user 100%, system 0.0%, iowait 0.0%, steal 0.0%)
Load     3.45 1.27 0.52
Memory   823 MiB used of 3.82 GiB (3.02 GiB available)
…
[WARN] Filesystem /data is 94% full
  measured: 9.44 MiB used, 572 KiB available of 10.0 MiB (tmpfs on tmpfs).
  possible cause: Growing log files or journals.
  …
  verify: du -xh --max-depth=2 /data 2>/dev/null | sort -h | tail -20

Every finding has three parts

Rate-based rules need a sustained condition, so a single spike doesn't raise an alarm.

measured

What the kernel actually reports, with numbers. A missing source shows as n/a, never an estimate.

possible cause

What usually leads to this, marked plainly as a hypothesis.

verify

The commands that confirm or rule it out, ready to paste.

It finds the source, not just the symptom

Packet drops

Traced to the UDP socket, the listen queue, the NIC ring, the CPU backlog or the conntrack table, and to the process behind it.

A full disk

Names deleted files that are still held open and the processes writing to the disk.

Slow leaks

Processes that keep growing are flagged as leak candidates.

Blocked tasks

Says whether they wait for NFS, the disk or a journal.

tirnix · overview, processes, diagnostics, history
Tirnix demo: overview, processes, diagnostics with findings, history and settings
Recorded in a Linux container with CPU burners, a 97 % full tmpfs and 30 zombie processes.

Eight screens, one key each

Works over SSH, in small terminals, without root. ASCII fallback for non-UTF-8 locales and NO_COLOR support. The footer always lists the keys of the current screen.

p pauses, + - change the refresh rate, ? shows all keys, q quits.

KeyScreenWhat you get
1OverviewCPU, memory, swap, load, disk and network, TCP, fullest filesystem, findings, top processes
2CPU & Memoryper-core usage, PSI, swap, major faults, OOM kills
3Disksthroughput, IOPS, await, utilisation, space and inodes
4Processessortable, with disk I/O and full command line, filter
5Networkerrors, drops, retransmissions, drop analysis
6Diagnosticsfindings, data source coverage, active checks
7Historyany metric from 1 hour to 30 days, compared with the previous period
8Settingsrefresh, background logging, retention, size limit

Lighter than the problem it finds

Measured on Linux 7.0, aarch64 with 8 CPUs, in a container with about 300 processes, 60 seconds each.

The optional logger keeps sampling after you close the TUI, with retention and a size limit: about 4.6 MiB a day at the default 10-second interval. Its systemd unit rates 1.1 in systemd-analyze security.

ModeCPU, one coreMemory
TUI, Overview, 2 s0.6 %2.1 MiB
TUI, Processes, 2 s0.8 %2.2 MiB
Logger, 10 s0.05 %1.5 MiB
Logger, 1 s0.23 %1.5 MiB

Install

Runs on any Linux distribution: tested on Debian 12, Ubuntu 24.04, Fedora 42 and Alpine 3.22. Kernel 4.20 or newer recommended for pressure stall information.

Install script

Verifies the download against the release's SHA256SUMS and installs one file, ~/.local/bin/tirnix. Read it first if you like.

No root needed
$ curl -fsSL https://raw.githubusercontent.com/Gelluithor/Tirnix/main/install.sh | sh

Packages

From the releases page. They install the binary and optional systemd units. No service is started.

Debian, Ubuntu · Fedora, RHEL
$ sudo apt install ./tirnix_0.2.0-1_amd64.deb
$ sudo dnf install ./tirnix-0.2.0-1.x86_64.rpm

From source

Rust 1.88 or newer. Other architectures build fine.

cargo
$ git clone https://github.com/Gelluithor/Tirnix && cd Tirnix
$ cargo build --release

Next time a server feels slow

Run tirnix before you start guessing. Or put tirnix report --seconds 30 into a script and get the findings as text.

usage
$ tirnix                      # interactive TUI
$ tirnix report --seconds 30  # summary and findings
$ tirnix logger start         # keep history
$ tirnix export --since 24h --format csv