summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-20 14:37:41 +0300
committerPaul Buetow <paul@buetow.org>2026-05-20 14:37:41 +0300
commit96355c79a38032ab4bd880b3b3ff4192ae709795 (patch)
tree7a395706e3db680f6e695c8602501741eed6ad45 /cmd
parentf063e626a28339735da583142e5af864a60c2111 (diff)
task 27: add KindSleep and requested sleep metric
Diffstat (limited to 'cmd')
-rw-r--r--cmd/ioworkload/scenario_sleep.go45
-rw-r--r--cmd/ioworkload/scenarios.go1
2 files changed, 46 insertions, 0 deletions
diff --git a/cmd/ioworkload/scenario_sleep.go b/cmd/ioworkload/scenario_sleep.go
new file mode 100644
index 0000000..bb6c5a4
--- /dev/null
+++ b/cmd/ioworkload/scenario_sleep.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "fmt"
+ "runtime"
+ "syscall"
+ "time"
+ "unsafe"
+
+ "golang.org/x/sys/unix"
+)
+
+const sleepSyscallsEmitFor = 2 * time.Second
+
+func sleepSyscalls() error {
+ deadline := time.Now().Add(sleepSyscallsEmitFor)
+ for time.Now().Before(deadline) {
+ if err := syscall.Nanosleep(&syscall.Timespec{Sec: 0, Nsec: 2_000_000}, nil); err != nil && err != syscall.EINTR {
+ return fmt.Errorf("nanosleep: %w", err)
+ }
+ if err := callClockNanosleep(3_000_000); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func callClockNanosleep(requestedNs int64) error {
+ req := unix.Timespec{Sec: requestedNs / 1_000_000_000, Nsec: requestedNs % 1_000_000_000}
+ _, _, errno := syscall.RawSyscall6(
+ unix.SYS_CLOCK_NANOSLEEP,
+ uintptr(unix.CLOCK_MONOTONIC),
+ 0,
+ uintptr(unsafe.Pointer(&req)),
+ 0,
+ 0,
+ 0,
+ )
+ runtime.KeepAlive(req)
+ if errno != 0 && errno != syscall.EINTR {
+ return fmt.Errorf("clock_nanosleep: %w", errno)
+ }
+ return nil
+}
+
diff --git a/cmd/ioworkload/scenarios.go b/cmd/ioworkload/scenarios.go
index 8f4eef2..e0827a5 100644
--- a/cmd/ioworkload/scenarios.go
+++ b/cmd/ioworkload/scenarios.go
@@ -35,6 +35,7 @@ var scenarios = map[string]func() error{
"eventfd-basic": eventfdBasic,
"eventfd2-basic": eventfd2Basic,
"polling-epoll": pollingEpoll,
+ "sleep-syscalls": sleepSyscalls,
"family-mixed": familyMixed,
"close-basic": closeBasic,
"close-range": closeRange,