From 5b968ccf1481a8bae7fce49cca01cf3597da4be8 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Wed, 10 Apr 2024 17:24:01 +0200 Subject: syz-manager: collect avg instance create time We will also use it to determine when we are ready to schedule programs that are very likely to crash instances. --- pkg/stats/avg.go | 32 ++++++++++++++++++++++++++++++++ syz-manager/manager.go | 7 ++++++- syz-manager/stats.go | 9 +++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 pkg/stats/avg.go diff --git a/pkg/stats/avg.go b/pkg/stats/avg.go new file mode 100644 index 000000000..430ff335b --- /dev/null +++ b/pkg/stats/avg.go @@ -0,0 +1,32 @@ +// Copyright 2024 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package stats + +import ( + "sync" + "time" +) + +type AverageParameter interface { + time.Duration +} + +type AverageValue[T AverageParameter] struct { + mu sync.Mutex + total int64 + avg T +} + +func (av *AverageValue[T]) Value() T { + av.mu.Lock() + defer av.mu.Unlock() + return av.avg +} + +func (av *AverageValue[T]) Save(val T) { + av.mu.Lock() + defer av.mu.Unlock() + av.total++ + av.avg += (val - av.avg) / T(av.total) +} diff --git a/syz-manager/manager.go b/syz-manager/manager.go index afddacf81..58744d35a 100644 --- a/syz-manager/manager.go +++ b/syz-manager/manager.go @@ -99,6 +99,8 @@ type Manager struct { assetStorage *asset.Storage + bootTime stats.AverageValue[time.Duration] + Stats } @@ -760,6 +762,8 @@ func (mgr *Manager) runInstance(index int) (*Crash, error) { } func (mgr *Manager) runInstanceInner(index int, instanceName string) (*report.Report, []byte, error) { + start := time.Now() + inst, err := mgr.vmPool.Create(index) if err != nil { return nil, nil, fmt.Errorf("failed to create instance: %w", err) @@ -794,7 +798,8 @@ func (mgr *Manager) runInstanceInner(index int, instanceName string) (*report.Re } // Run the fuzzer binary. - start := time.Now() + mgr.bootTime.Save(time.Since(start)) + start = time.Now() mgr.statNumFuzzing.Add(1) defer mgr.statNumFuzzing.Add(-1) diff --git a/syz-manager/stats.go b/syz-manager/stats.go index 7cb67d5ca..1169f4125 100644 --- a/syz-manager/stats.go +++ b/syz-manager/stats.go @@ -20,6 +20,7 @@ type Stats struct { statSuppressed *stats.Val statUptime *stats.Val statFuzzingTime *stats.Val + statAvgBootTime *stats.Val } func (mgr *Manager) initStats() { @@ -48,6 +49,14 @@ func (mgr *Manager) initStats() { }, func(v int, period time.Duration) string { return fmt.Sprintf("%v sec", v) }) + mgr.statAvgBootTime = stats.Create("instance restart", "Average VM restart time (sec)", + stats.NoGraph, + func() int { + return int(mgr.bootTime.Value().Seconds()) + }, + func(v int, _ time.Duration) string { + return fmt.Sprintf("%v sec", v) + }) stats.Create("heap", "Process heap size (bytes)", stats.Graph("memory"), func() int { -- cgit mrf-deployment