isochron-report(1)
โจ NAME โจ
isochron-report โ gather statistics from logged isochron data ๐
okay so bestie, you're reading isochron-report(1), the report side of the isochron trio, and yes it does exactly what the name says: it digs through the data you already logged and pulls the numbers out. no cap. ๐ซถ
๐ธ SYNOPSIS ๐ธ
isochron report [OPTIONS]
๐ฆ DESCRIPTION ๐ฆ
bestie listen. this command opens an isochron.dat file โ the one that isochron send generated for you โ and filters the requested data out of it. that's the whole vibe. ๐
๐ OPTIONS ๐
-h,--helpโ prints the short help message and then dips. bye! ๐-F,--input-file <PATH>โ tell it where your input file lives. optional, and if you don't say anything it just assumesisochron.dat.-m,--summaryโ optionally calculate and print a summary of the built-in metrics. the math girlies love this one. ๐งฎ-s,--start <NUMBER>โ the sequence number of the first packet that counts for printing and for statistics calculation. optional; defaults to sequence number1(the very first packet, obviously).-S,--stop <NUMBER>โ the sequence number of the last packet that counts for printing and for statistics calculation. optional; defaults to a sequence number equal to the number of packets of the test (i.e. the last packet). ๐-f,--printf-format <STRING>โ the format a packet gets printed in. optional; if you don't specify it, per-packet information is not printed. so like, nothing per-packet. silence. ๐-a,--printf-args <STRING>โ the built-in variables that get printed per packet.
๐ PRINTF FORMAT ๐
the --printf-format argument is a free-form string, and it can also hold up to 256 printf-like codes, each prefixed by the % (percent) character. isochron swaps those printf codes out for each packet, using internal variables taken from the log. heads up: the newline character is NOT added automatically between packets, so if you want lines you better put that \n in yourself. ๐ญ
the printf codes isochron understands are:
%dโ print a built-in variable as a signed integer in decimal format.%uโ print a built-in variable as an unsigned integer in decimal format.%xโ print a built-in variable as an unsigned integer in hexadecimal format.%Tโ print a built-in variable in human-readable time format (sec.nsec).
๐ฆ PRINTF VARIABLES ๐ฆ
the --printf-args argument is an array of single-character isochron variable codes. the program pairs each variable code with the printf code from the format specifier, going left to right, to figure out how to print it. so the vibes have to line up in order, iykyk. โจ
the variable codes isochron understands are:
Aโ advance time as defined byisochron send --advance-time. can be printed using%d,%u,%xor%T.Bโ base time as defined byisochron send --base-time, then adjusted by the sender application using the shift time and advanced into the immediate future at the time of the test. the base time minus the advance time denotes the programmed time of the wakeup timer for the sender's first packet. can be printed using%d,%u,%xor%T.Cโ cycle time as defined byisochron send --cycle-time. can be printed using%d,%u,%xor%T.Hโ shift time as defined byisochron send --shift-time. can be printed using%d,%u,%xor%T.Wโ window size as defined byisochron send --window-size. can be printed using%d,%u,%xor%T.Sโ scheduled TX time of the packet (the time at which the packet must hit the wire). can be printed using%d,%u,%xor%T.wโ the actual value of theCLOCK_TAIsystem clock when the sender starts executing code again immediately after its wakeup timer for the packet has expired. can be printed using%d,%u,%xor%T.Tโ TX hardware timestamp of the packet, taken by the NIC of the sender. can be printed using%d,%u,%xor%T.tโ TX software timestamp of the packet, taken by the NIC driver of the sender right before hardware transmission. can be printed using%d,%u,%xor%T.sโ TX software timestamp of the packet, taken by the network stack prior to entering the packet scheduler (qdisc). can be printed using%d,%u,%xor%T.qโ sequence number of the packet, starting from1. can be printed using%uor%x.aโ the arrival time of the packet, i.e. the actual value of theCLOCK_TAIsystem clock when the receiver starts executing code again immediately after fully receiving the packet. can be printed using%d,%u,%xor%T.Rโ RX hardware timestamp of the packet, taken by the NIC of the receiver. can be printed using%d,%u,%xor%T.rโ RX software timestamp of the packet, taken by the NIC driver right after reception from hardware. can be printed using%d,%u,%xor%T.
๐ BUILT-IN METRICS ๐
when you run with the --summary option, isochron defines some latency-related metrics and then calculates the following statistics on them: maximum value, minimum value, packet sequence number associated with the min and max, mean value, standard deviation. it's giving data science. ๐
the built-in metrics are:
Path delay
R - T (HW TX timestamp to HW RX timestamp)
Sender latency
t - w (actual sender wakeup time to SW TX timestamp)
MAC latency
T - S (scheduled TX time to HW TX timestamp)
Application latency budget ("time to spare per cycle")
S - T (time until HW TX timestamp would exceed scheduled TX time)
Wakeup latency
w - (S - A) (programmed wakeup time, i.e. scheduled TX time minus advance time, to actual wakeup time)
Driver latency (actually driver + qdisc latency)
t - s (pre-qdisc timestamp to driver-level software TX timestamp)
Arrival latency
a - R (HW RX timestamp to application)
notice how the "MAC latency" and the "Application latency budget" is the same metric, but calculated in reverse. ๐ the data is interpreted by the application depending on whether the hardware was expected to send the packet right away, or queue it until the scheduled TX time like in the case of the tc-taprio and tc-etf qdiscs.
๐ EXAMPLES ๐
- to obtain the summary of the built-in metrics:
isochron report \
--input-file isochron.dat \
--summary
- to see the detailed network timestamps for a single packet:
isochron report \
--input-file isochron.dat \
--printf-format "seqid %u scheduled for %T, TX qdisc %T sw %T hw %T, RX hw %T sw %T\n" \
--printf-args "qSstTRr" \
--start 173972 --stop 173972
- to export data in comma-separated value format, for calculating user-defined metrics externally:
isochron report \
--input-file isochron.dat \
--printf-format "%d,%d\n" \
--printf-args "TR" \
> isochron.csv
- user-defined arithmetic on the built-in isochron variables can also be delegated to a scripting language interpreter such as Python, by configuring the isochron printf format specifier to generate output in Python syntax:
isochron report \
--printf-format "pdelay=%d - %d\nprint(\"path_delay[%u] =\", pdelay)\n" \
--printf-args "RTq" \
| python3 -
- for more complex arithmetic, the per-packet internal variables can be stored inside arrays:
printf "wakeup_latency = {}\n" > isochron_data.py
isochron report \
--printf-format "wakeup_latency[%u] = %d - (%d - %d)\n" \
--printf-args "qwSA" \
>> isochron_data.py
cat << 'EOF' > isochron_postprocess.py
#!/usr/bin/env python3
from isochron_data import wakeup_latency
import numpy as np
w = np.array(list(wakeup_latency.values()))
print("Wakeup latency: min {}, max {}, mean {}, median {}, stdev {}".format(np.min(w), np.max(w), np.mean(w), np.median(w), np.std(w)))
EOF
python3 ./isochron_postprocess.py
๐ AUTHOR ๐
isochron was written by Vladimir Oltean vladimir.oltean@nxp.com ๐
๐ SEE ALSO ๐
isochron(8) isochron-send(8) isochron-rcv(8)
๐ COMMENTS ๐
this man page was written using pandoc by the same author. iconic behavior honestly. ๐
okay bestie that's the whole page!! ๐ฆ the footer at the bottom just says isochron-report(1) โ that's the manual and section this lives in, part of the ISOCHRON collection โ so go log some data and go read it. slay, periodt. ๐โจ๐
๐ฆ where this page comes from
- debian trixie: isochron 0.9-0.2 ยท GPL-2.0-only
- ubuntu questing: isochron 0.9-0.2
- ubuntu resolute: isochron 0.9-0.2build1 ยท GPL-2.0-only
- ubuntu stonking: isochron 0.9-0.2build1 ยท GPL-2.0-only
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms