From 96355c79a38032ab4bd880b3b3ff4192ae709795 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 20 May 2026 14:37:41 +0300 Subject: task 27: add KindSleep and requested sleep metric --- cmd/ioworkload/scenario_sleep.go | 45 ++++++++++++++++++++++++++++++++++++++++ cmd/ioworkload/scenarios.go | 1 + 2 files changed, 46 insertions(+) create mode 100644 cmd/ioworkload/scenario_sleep.go (limited to 'cmd') 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, -- cgit v1.2.3