summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gemfeed/2026-05-11-unveiling-ior-ng-part-2.html22
-rw-r--r--gemfeed/atom.xml20
-rw-r--r--gemfeed/index.html2
-rw-r--r--index.html4
-rw-r--r--uptime-stats.html16
5 files changed, 43 insertions, 21 deletions
diff --git a/gemfeed/2026-05-11-unveiling-ior-ng-part-2.html b/gemfeed/2026-05-11-unveiling-ior-ng-part-2.html
index e9c37d22..60f0a786 100644
--- a/gemfeed/2026-05-11-unveiling-ior-ng-part-2.html
+++ b/gemfeed/2026-05-11-unveiling-ior-ng-part-2.html
@@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>1) Enable repos and install build dependencies. CRB ships zlib-static / glibc-static.</title>
+<title>Unveiling I/O Riot NG — Part 2: install and compile once, run everywhere</title>
<link rel="shortcut icon" type="image/gif" href="/favicon.ico" />
<link rel="stylesheet" href="../style.css" />
<link rel="stylesheet" href="style-override.css" />
@@ -11,7 +11,9 @@
<p class="header">
<a href="https://foo.zone">Home</a> | <a href="https://codeberg.org/snonux/foo.zone/src/branch/content-md/gemfeed/2026-05-11-unveiling-ior-ng-part-2.md">Markdown</a> | <a href="gemini://foo.zone/gemfeed/2026-05-11-unveiling-ior-ng-part-2.gmi">Gemini</a> | <a href="https://snonux.foo">Microblog</a> | <a href="https://irregular.ninja">Street photography</a>
</p>
-<span> (or Podman)# Unveiling I/O Riot NG — Part 2: install and compile once, run everywhere</span><br />
+<h1 style='display: inline' id='unveiling-io-riot-ng--part-2-install-and-compile-once-run-everywhere'>Unveiling I/O Riot NG — Part 2: install and compile once, run everywhere</h1><br />
+<br />
+<span class='quote'>Published at 2026-05-10T22:43:39+03:00</span><br />
<br />
<span>This is Part 2 of three. Part 1 is the demo-driven tour: what ior looks like, how the dashboard tabs work, how filtering and recording behave. This part is about the installation for Rocky Linux 8 and 9 and, more interestingly, why you only have to do that dance on a single machine: the resulting binary is portable to every other Linux box thanks to CO-RE (Compile Once, Run Everywhere) plus full static linking. Part 3 is the under-the-hood companion (per-event schema, async-syscall caveats, the syscall-coverage probe generator, and post-mortem SQL on the parquet output).</span><br />
<br />
@@ -22,11 +24,8 @@
<br />
<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br />
<br />
-<span class='quote'>Published at 2026-05-10T22:41:23+03:00</span><br />
-<br />
-<span class='quote'>Published at 2026-05-10T22:39:24+03:00</span><br />
-<br />
<ul>
+<li><a href='#unveiling-io-riot-ng--part-2-install-and-compile-once-run-everywhere'>Unveiling I/O Riot NG — Part 2: install and compile once, run everywhere</a></li>
<li>⇢ <a href='#installing-ior'>Installing ior</a></li>
<li>⇢ ⇢ <a href='#why-native-installation-is-a-mess'>Why native installation is a mess</a></li>
<li>⇢ ⇢ <a href='#what-the-docker-build-is-actually-doing'>What the Docker build is actually doing</a></li>
@@ -41,6 +40,10 @@
</ul><br />
<h2 style='display: inline' id='installing-ior'>Installing ior</h2><br />
<br />
+<span class='quote'>Published at 2026-05-10T22:41:23+03:00</span><br />
+<br />
+<span class='quote'>Published at 2026-05-10T22:39:24+03:00</span><br />
+<br />
<span>The short answer: Use Docker (or Podman). One command, no toolchain setup, works from any Docker-capable Linux host with BTF available:</span><br />
<br />
<!-- Generator: GNU source-highlight 3.1.9
@@ -132,6 +135,8 @@ sudo ./ior -plain -duration <font color="#000000">5</font>
<br />
<span>If you haven&#39;t touched eBPF before: it&#39;s a small in-kernel bytecode VM. You compile a tiny C program, the kernel verifies it can&#39;t crash or loop forever, and then it runs every time some hook fires — a syscall enter/exit, a kprobe, a tracepoint, a network packet. The program writes events into a ring buffer that userspace mmaps and drains. No kernel module, no patched kernel, no debug symbols required.</span><br />
<br />
+<a class='textlink' href='https://ebpf.io'>eBPF — the project&#39;s umbrella site (docs, talks, ecosystem)</a><br />
+<br />
<span><span class='inlinecode'>ior</span> plugs into the syscall tracepoints (<span class='inlinecode'>sys_enter_openat</span>, <span class='inlinecode'>sys_exit_read</span>, etc.) and the BPF side does the bare minimum: timestamp the event, copy a few fields, push to a perf ring buffer. All the heavy lifting (string interning, latency math, aggregation, the dashboard) is in Go on the userspace side.</span><br />
<br />
<span>The shape of the data flow:</span><br />
@@ -159,10 +164,15 @@ sudo ./ior -plain -duration <font color="#000000">5</font>
<br />
<span>The kernel ships a C library called libbpf that handles loading the program, attaching it to hooks, managing maps, and reading the ring buffer. There are two well-known ways to drive that from Go:</span><br />
<br />
+<a class='textlink' href='https://github.com/libbpf/libbpf'>libbpf — the upstream C library</a><br />
+<br />
<ul>
<li>libbpfgo (Aqua Security): a thin cgo wrapper around libbpf. You ship libbpf along with your binary and call into the same C API that <span class='inlinecode'>bpftool</span> and <span class='inlinecode'>perf</span> use.</li>
<li>cilium/ebpf: a from-scratch pure-Go reimplementation of everything libbpf does (ELF parser, BTF resolver, syscall layer, the lot).</li>
</ul><br />
+<a class='textlink' href='https://github.com/aquasecurity/libbpfgo'>libbpfgo — Aqua Security&#39;s cgo wrapper around libbpf</a><br />
+<a class='textlink' href='https://github.com/cilium/ebpf'>cilium/ebpf — pure-Go reimplementation</a><br />
+<br />
<span>I went with libbpfgo specifically because it&#39;s a wrapper, not a reimplementation.</span><br />
<br />
<h2 style='display: inline' id='co-re--the-part-that-makes-the-binary-actually-portable'>CO-RE — the part that makes the binary actually portable</h2><br />
diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml
index 71ab0dad..982d99d8 100644
--- a/gemfeed/atom.xml
+++ b/gemfeed/atom.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
- <updated>2026-05-10T22:41:22+03:00</updated>
+ <updated>2026-05-10T22:43:40+03:00</updated>
<title>foo.zone feed</title>
<subtitle>To be in the .zone!</subtitle>
<link href="https://foo.zone/gemfeed/atom.xml" rel="self" />
<link href="https://foo.zone/" />
<id>https://foo.zone/</id>
<entry>
- <title>1) Enable repos and install build dependencies. CRB ships zlib-static / glibc-static.</title>
+ <title>Unveiling I/O Riot NG — Part 2: install and compile once, run everywhere</title>
<link href="https://foo.zone/gemfeed/2026-05-11-unveiling-ior-ng-part-2.html" />
<id>https://foo.zone/gemfeed/2026-05-11-unveiling-ior-ng-part-2.html</id>
- <updated>2026-05-10T22:39:24+03:00</updated>
+ <updated>2026-05-10T22:43:39+03:00</updated>
<author>
<name>Paul Buetow aka snonux</name>
<email>paul@dev.buetow.org</email>
@@ -18,7 +18,7 @@
<summary>This is Part 2 of three. Part 1 is the demo-driven tour: what ior looks like, how the dashboard tabs work, how filtering and recording behave. This part is about the installation for Rocky Linux 8 and 9 and, more interestingly, why you only have to do that dance on a single machine: the resulting binary is portable to every other Linux box thanks to CO-RE (Compile Once, Run Everywhere) plus full static linking. Part 3 is the under-the-hood companion (per-event schema, async-syscall caveats, the syscall-coverage probe generator, and post-mortem SQL on the parquet output).</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <span> (or Podman)# Unveiling I/O Riot NG — Part 2: install and compile once, run everywhere</span><br />
+ <h1 style='display: inline' id='unveiling-io-riot-ng--part-2-install-and-compile-once-run-everywhere'>Unveiling I/O Riot NG — Part 2: install and compile once, run everywhere</h1><br />
<br />
<span>This is Part 2 of three. Part 1 is the demo-driven tour: what ior looks like, how the dashboard tabs work, how filtering and recording behave. This part is about the installation for Rocky Linux 8 and 9 and, more interestingly, why you only have to do that dance on a single machine: the resulting binary is portable to every other Linux box thanks to CO-RE (Compile Once, Run Everywhere) plus full static linking. Part 3 is the under-the-hood companion (per-event schema, async-syscall caveats, the syscall-coverage probe generator, and post-mortem SQL on the parquet output).</span><br />
<br />
@@ -30,6 +30,7 @@
<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br />
<br />
<ul>
+<li><a href='#unveiling-io-riot-ng--part-2-install-and-compile-once-run-everywhere'>Unveiling I/O Riot NG — Part 2: install and compile once, run everywhere</a></li>
<li>⇢ <a href='#installing-ior'>Installing ior</a></li>
<li>⇢ ⇢ <a href='#why-native-installation-is-a-mess'>Why native installation is a mess</a></li>
<li>⇢ ⇢ <a href='#what-the-docker-build-is-actually-doing'>What the Docker build is actually doing</a></li>
@@ -44,6 +45,10 @@
</ul><br />
<h2 style='display: inline' id='installing-ior'>Installing ior</h2><br />
<br />
+<span class='quote'>Published at 2026-05-10T22:41:23+03:00</span><br />
+<br />
+<span class='quote'>Published at 2026-05-10T22:39:24+03:00</span><br />
+<br />
<span>The short answer: Use Docker (or Podman). One command, no toolchain setup, works from any Docker-capable Linux host with BTF available:</span><br />
<br />
<!-- Generator: GNU source-highlight 3.1.9
@@ -135,6 +140,8 @@ sudo ./ior -plain -duration <font color="#000000">5</font>
<br />
<span>If you haven&#39;t touched eBPF before: it&#39;s a small in-kernel bytecode VM. You compile a tiny C program, the kernel verifies it can&#39;t crash or loop forever, and then it runs every time some hook fires — a syscall enter/exit, a kprobe, a tracepoint, a network packet. The program writes events into a ring buffer that userspace mmaps and drains. No kernel module, no patched kernel, no debug symbols required.</span><br />
<br />
+<a class='textlink' href='https://ebpf.io'>eBPF — the project&#39;s umbrella site (docs, talks, ecosystem)</a><br />
+<br />
<span><span class='inlinecode'>ior</span> plugs into the syscall tracepoints (<span class='inlinecode'>sys_enter_openat</span>, <span class='inlinecode'>sys_exit_read</span>, etc.) and the BPF side does the bare minimum: timestamp the event, copy a few fields, push to a perf ring buffer. All the heavy lifting (string interning, latency math, aggregation, the dashboard) is in Go on the userspace side.</span><br />
<br />
<span>The shape of the data flow:</span><br />
@@ -162,10 +169,15 @@ sudo ./ior -plain -duration <font color="#000000">5</font>
<br />
<span>The kernel ships a C library called libbpf that handles loading the program, attaching it to hooks, managing maps, and reading the ring buffer. There are two well-known ways to drive that from Go:</span><br />
<br />
+<a class='textlink' href='https://github.com/libbpf/libbpf'>libbpf — the upstream C library</a><br />
+<br />
<ul>
<li>libbpfgo (Aqua Security): a thin cgo wrapper around libbpf. You ship libbpf along with your binary and call into the same C API that <span class='inlinecode'>bpftool</span> and <span class='inlinecode'>perf</span> use.</li>
<li>cilium/ebpf: a from-scratch pure-Go reimplementation of everything libbpf does (ELF parser, BTF resolver, syscall layer, the lot).</li>
</ul><br />
+<a class='textlink' href='https://github.com/aquasecurity/libbpfgo'>libbpfgo — Aqua Security&#39;s cgo wrapper around libbpf</a><br />
+<a class='textlink' href='https://github.com/cilium/ebpf'>cilium/ebpf — pure-Go reimplementation</a><br />
+<br />
<span>I went with libbpfgo specifically because it&#39;s a wrapper, not a reimplementation.</span><br />
<br />
<h2 style='display: inline' id='co-re--the-part-that-makes-the-binary-actually-portable'>CO-RE — the part that makes the binary actually portable</h2><br />
diff --git a/gemfeed/index.html b/gemfeed/index.html
index f1b162cc..35e55a97 100644
--- a/gemfeed/index.html
+++ b/gemfeed/index.html
@@ -15,7 +15,7 @@
<br />
<h2 style='display: inline' id='to-be-in-the-zone'>To be in the .zone!</h2><br />
<br />
-<a class='textlink' href='./2026-05-11-unveiling-ior-ng-part-2.html'>2026-05-11 - 1) Enable repos and install build dependencies. CRB ships zlib-static / glibc-static.</a><br />
+<a class='textlink' href='./2026-05-11-unveiling-ior-ng-part-2.html'>2026-05-11 - Unveiling I/O Riot NG — Part 2: install and compile once, run everywhere</a><br />
<a class='textlink' href='./2026-05-08-unveiling-ior-ng-part-1.html'>2026-05-08 - Unveiling I/O Riot NG — Part 1: a guided tour</a><br />
<a class='textlink' href='./2026-04-02-f3s-kubernetes-with-freebsd-part-9.html'>2026-04-02 - f3s: Kubernetes with FreeBSD - Part 9: GitOps with ArgoCD</a><br />
<a class='textlink' href='./2026-04-02-distributed-systems-simulator-part-3.html'>2026-04-02 - Distributed Systems Simulator - Part 3: Advanced Examples and Protocol API</a><br />
diff --git a/index.html b/index.html
index 51567cd4..2ae6e57e 100644
--- a/index.html
+++ b/index.html
@@ -13,7 +13,7 @@
</p>
<h1 style='display: inline' id='hello'>Hello!</h1><br />
<br />
-<span class='quote'>This site was generated at 2026-05-10T22:41:48+03:00 by <span class='inlinecode'>Gemtexter</span></span><br />
+<span class='quote'>This site was generated at 2026-05-10T22:43:40+03:00 by <span class='inlinecode'>Gemtexter</span></span><br />
<br />
<span>Welcome to the foo.zone!</span><br />
<br />
@@ -33,7 +33,7 @@
<br />
<h3 style='display: inline' id='posts'>Posts</h3><br />
<br />
-<a class='textlink' href='./gemfeed/2026-05-11-unveiling-ior-ng-part-2.html'>2026-05-11 - 1) Enable repos and install build dependencies. CRB ships zlib-static / glibc-static.</a><br />
+<a class='textlink' href='./gemfeed/2026-05-11-unveiling-ior-ng-part-2.html'>2026-05-11 - Unveiling I/O Riot NG — Part 2: install and compile once, run everywhere</a><br />
<a class='textlink' href='./gemfeed/2026-05-08-unveiling-ior-ng-part-1.html'>2026-05-08 - Unveiling I/O Riot NG — Part 1: a guided tour</a><br />
<a class='textlink' href='./gemfeed/2026-04-02-f3s-kubernetes-with-freebsd-part-9.html'>2026-04-02 - f3s: Kubernetes with FreeBSD - Part 9: GitOps with ArgoCD</a><br />
<a class='textlink' href='./gemfeed/2026-04-02-distributed-systems-simulator-part-3.html'>2026-04-02 - Distributed Systems Simulator - Part 3: Advanced Examples and Protocol API</a><br />
diff --git a/uptime-stats.html b/uptime-stats.html
index 4c6bde34..ee63e7f0 100644
--- a/uptime-stats.html
+++ b/uptime-stats.html
@@ -13,7 +13,7 @@
</p>
<h1 style='display: inline' id='my-machine-uptime-stats'>My machine uptime stats</h1><br />
<br />
-<span class='quote'>This site was last updated at 2026-05-10T22:41:48+03:00</span><br />
+<span class='quote'>This site was last updated at 2026-05-10T22:43:40+03:00</span><br />
<br />
<span>The following stats were collected via <span class='inlinecode'>uptimed</span> on all of my personal computers over many years and the output was generated by <span class='inlinecode'>goprecords</span>, the global uptime records stats analyser of mine.</span><br />
<br />
@@ -26,7 +26,7 @@
<br />
<a class='textlink' href='./gemfeed/2023-05-01-unveiling-guprecords:-uptime-records-with-raku.html'>Unveiling <span class='inlinecode'>guprecords.raku</span>: Uptime records with Raku (and also there is a version in Go now)</a><br />
<br />
-<span class='quote'>Uptime stats were last updated Sun 10 May 22:41:48 EEST 2026</span><br />
+<span class='quote'>Uptime stats were last updated Sun 10 May 22:43:40 EEST 2026</span><br />
<br />
<h2 style='display: inline' id='top-20-uptime-s-by-host'>Top 20 Uptime&#39;s by Host</h2><br />
<br />
@@ -93,8 +93,8 @@
| 1. | *f2 | 245 | FreeBSD 15.0-RELEASE-p4 |
| 2. | *f1 | 243 | FreeBSD 15.0-RELEASE-p4 |
| 3. | *f0 | 242 | FreeBSD 15.0-RELEASE-p4 |
-| 4. | *pi0 | 26 | Linux 6.1.31-v8.1.el9.altarch |
-| 5. | *pi2 | 26 | Linux 6.1.31-v8.1.el9.altarch |
+| 4. | *pi2 | 26 | Linux 6.1.31-v8.1.el9.altarch |
+| 5. | *pi0 | 26 | Linux 6.1.31-v8.1.el9.altarch |
| 6. | pi1 | 1 | Linux 6.1.31-v8.1.el9.altarch |
| 7. | pi3 | 1 | Linux 6.1.31-v8.1.el9.altarch |
+-----+------+-------+-------------------------------+
@@ -111,10 +111,10 @@
| 1. | *f1 | 75 | FreeBSD 15.0-RELEASE-p4 |
| 2. | *f2 | 75 | FreeBSD 15.0-RELEASE-p4 |
| 3. | *f0 | 74 | FreeBSD 15.0-RELEASE-p4 |
-| 4. | *pi2 | 8 | Linux 6.1.31-v8.1.el9.altarch |
-| 5. | *pi0 | 8 | Linux 6.1.31-v8.1.el9.altarch |
-| 6. | pi3 | 0 | Linux 6.1.31-v8.1.el9.altarch |
-| 7. | pi1 | 0 | Linux 6.1.31-v8.1.el9.altarch |
+| 4. | *pi0 | 8 | Linux 6.1.31-v8.1.el9.altarch |
+| 5. | *pi2 | 8 | Linux 6.1.31-v8.1.el9.altarch |
+| 6. | pi1 | 0 | Linux 6.1.31-v8.1.el9.altarch |
+| 7. | pi3 | 0 | Linux 6.1.31-v8.1.el9.altarch |
+-----+------+-------+-------------------------------+
</pre>
<br />