summaryrefslogtreecommitdiff
path: root/demo/scripts/workload.sh
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-02 17:23:14 +0300
committerPaul Buetow <paul@buetow.org>2026-05-02 17:23:14 +0300
commit3b20f2c4d16c7b7f583e9ab2b51213e9ddc94fd5 (patch)
treeeacf06f08dc885bbac499b5dbe318fb7ff2e23d5 /demo/scripts/workload.sh
parent0528557ee9f14ed292de49be09e65b8662185c38 (diff)
add demo sources: VHS tapes, helper scripts, and tutorial
Tracks the inputs that drive `mage demo` so the GIFs and screenshots under demo/assets/ can be reproduced from a checkout. The generated assets themselves (~50 MB of GIFs and PNGs) are excluded via gitignore since they're fully reproducible from the tapes in ~10 min. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Diffstat (limited to 'demo/scripts/workload.sh')
-rwxr-xr-xdemo/scripts/workload.sh77
1 files changed, 77 insertions, 0 deletions
diff --git a/demo/scripts/workload.sh b/demo/scripts/workload.sh
new file mode 100755
index 0000000..ebbf58b
--- /dev/null
+++ b/demo/scripts/workload.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+# Background workload for demo tapes. Generates a steady mix of file I/O
+# (open/read/close), big writes (fsync/dd), stat-heavy traffic, and ioworkload
+# scenarios so every TUI tab has something interesting to display.
+#
+# Designed to be killed via `kill $!` from the tape wrapper. All children are
+# placed in this script's process group so a single signal cleans them up.
+
+set -u
+
+ROOT="$(cd "$(dirname "$0")/.." && pwd)"
+IOWORKLOAD="${ROOT}/../ioworkload"
+SCRATCH="$(mktemp -d -t ior-demo-workload-XXXXXX)"
+trap 'rm -rf "$SCRATCH"' EXIT
+
+cleanup() {
+ trap - TERM INT
+ # Kill the entire process group so all background loops stop.
+ kill -- -$$ 2>/dev/null || true
+ exit 0
+}
+trap cleanup TERM INT
+
+# A) walk /usr and read first byte of each file: tons of openat/read/close + varied paths.
+(
+ while true; do
+ find /usr/share /usr/lib -maxdepth 4 -type f 2>/dev/null \
+ | shuf -n 800 \
+ | xargs -r -I{} sh -c 'head -c 1 "{}" >/dev/null 2>&1' || true
+ sleep 1
+ done
+) &
+
+# B) periodic large write with fsync via dd: fills the latency tab with slow writes.
+(
+ while true; do
+ dd if=/dev/zero of="${SCRATCH}/big.bin" bs=1M count=20 conv=fsync status=none 2>/dev/null || true
+ sleep 3
+ rm -f "${SCRATCH}/big.bin"
+ done
+) &
+
+# C) stat-heavy directory crawl: feeds the syscall tab with newfstatat/getdents.
+(
+ while true; do
+ find /etc /var/log -maxdepth 3 >/dev/null 2>&1 || true
+ sleep 2
+ done
+) &
+
+# D) ioworkload scenario rotation if the binary exists: gives us syscall variety
+# beyond what the shell utilities trigger (mmap, dup, fcntl, sync, rename, link).
+if [ -x "$IOWORKLOAD" ]; then
+ (
+ scenarios=(
+ open-basic
+ readwrite-basic
+ stat-basic
+ stat-statx
+ mmap-basic
+ sync-basic
+ dup-basic
+ fcntl-dupfd
+ rename-basic
+ link-basic
+ dir-basic
+ )
+ while true; do
+ for s in "${scenarios[@]}"; do
+ "$IOWORKLOAD" --scenario="$s" >/dev/null 2>&1 || true
+ done
+ done
+ ) &
+fi
+
+# Idle until killed.
+wait