aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-04-10 17:24:01 +0200
committerAleksandr Nogikh <nogikh@google.com>2024-04-10 15:34:42 +0000
commit5b968ccf1481a8bae7fce49cca01cf3597da4be8 (patch)
tree1f339f51d54e4ca960c31b6d262e2912ade06468
parent6e189cf48871220fff5a087cc06b6682e052da3c (diff)
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.
-rw-r--r--pkg/stats/avg.go32
-rw-r--r--syz-manager/manager.go7
-rw-r--r--syz-manager/stats.go9
3 files changed, 47 insertions, 1 deletions
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 {