diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-20 14:37:41 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-20 14:37:41 +0300 |
| commit | 96355c79a38032ab4bd880b3b3ff4192ae709795 (patch) | |
| tree | 7a395706e3db680f6e695c8602501741eed6ad45 /cmd | |
| parent | f063e626a28339735da583142e5af864a60c2111 (diff) | |
task 27: add KindSleep and requested sleep metric
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/ioworkload/scenario_sleep.go | 45 | ||||
| -rw-r--r-- | cmd/ioworkload/scenarios.go | 1 |
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, |
