From 823604de7e37a64ddca1f3a9b5ac2d287eb2a774 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 19 Jan 2017 13:17:24 +0100 Subject: syz-manager: track fuzzing time Fuzzing time is amount of time we spent actually fuzzing. It excludes VM creation time, crash reproducing time, etc. On the other hand it is multipled by number of currently fuzzing VMs, so it can be larger than uptime time. --- syz-manager/html.go | 1 + syz-manager/manager.go | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/syz-manager/html.go b/syz-manager/html.go index 75d34c5e5..e9a006d07 100644 --- a/syz-manager/html.go +++ b/syz-manager/html.go @@ -55,6 +55,7 @@ func (mgr *Manager) httpSummary(w http.ResponseWriter, r *http.Request) { Name: mgr.cfg.Name, } data.Stats = append(data.Stats, UIStat{Name: "uptime", Value: fmt.Sprint(time.Since(mgr.startTime) / 1e9 * 1e9)}) + data.Stats = append(data.Stats, UIStat{Name: "fuzzing", Value: fmt.Sprint(mgr.fuzzingTime / 60e9 * 60e9)}) data.Stats = append(data.Stats, UIStat{Name: "corpus", Value: fmt.Sprint(len(mgr.corpus))}) data.Stats = append(data.Stats, UIStat{Name: "triage queue", Value: fmt.Sprint(len(mgr.candidates))}) diff --git a/syz-manager/manager.go b/syz-manager/manager.go index ef079375f..ec8ac79c5 100644 --- a/syz-manager/manager.go +++ b/syz-manager/manager.go @@ -15,6 +15,7 @@ import ( "os/signal" "path/filepath" "sync" + "sync/atomic" "syscall" "time" @@ -49,10 +50,12 @@ type Manager struct { corpusDB *db.DB startTime time.Time firstConnect time.Time + fuzzingTime time.Duration stats map[string]uint64 vmStop chan bool vmChecked bool fresh bool + numFuzzing uint32 mu sync.Mutex enabledSyscalls string @@ -192,9 +195,13 @@ func RunManager(cfg *config.Config, syscalls map[int]bool) { }() go func() { - for { + for lastTime := time.Now(); ; { time.Sleep(10 * time.Second) + now := time.Now() + diff := now.Sub(lastTime) + lastTime = now mgr.mu.Lock() + mgr.fuzzingTime += diff * time.Duration(atomic.LoadUint32(&mgr.numFuzzing)) executed := mgr.stats["exec total"] crashes := mgr.stats["crashes"] mgr.mu.Unlock() @@ -381,6 +388,8 @@ func (mgr *Manager) runInstance(vmCfg *vm.Config, first bool) (*Crash, error) { // Run the fuzzer binary. start := time.Now() + atomic.AddUint32(&mgr.numFuzzing, 1) + defer atomic.AddUint32(&mgr.numFuzzing, ^uint32(0)) cmd := fmt.Sprintf("%v -executor=%v -name=%v -manager=%v -output=%v -procs=%v -leak=%v -cover=%v -sandbox=%v -debug=%v -v=%d", fuzzerBin, executorBin, vmCfg.Name, fwdAddr, mgr.cfg.Output, procs, leak, mgr.cfg.Cover, mgr.cfg.Sandbox, *flagDebug, fuzzerV) outc, errc, err := inst.Run(time.Hour, mgr.vmStop, cmd) -- cgit mrf-deployment