xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Ronald Rojas <ronladred@gmail.com>
To: xen-devel <xen-devel@lists.xen.org>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Wei Liu <wei.liu2@citrix.com>,
	George Dunlap <george.dunlap@citrix.com>,
	George Dunlap <dunlapg@umich.edu>
Subject: [PATCH RFC 21/59] Report utilization statistics
Date: Wed, 28 Dec 2016 20:14:14 -0500	[thread overview]
Message-ID: <1482974092-15891-21-git-send-email-ronladred@gmail.com> (raw)
In-Reply-To: <1482974092-15891-1-git-send-email-ronladred@gmail.com>

From: George Dunlap <george.dunlap@citrix.com>

Refactor the min/max into a separate type.

Signed-off-by: George Dunlap <george.dunlap@citrix.com>
---
 benchmark.go | 119 +++++++++++++++++++++++++++++++++++++----------------------
 run.go       |   4 +-
 2 files changed, 78 insertions(+), 45 deletions(-)

diff --git a/benchmark.go b/benchmark.go
index 4b2d805..b0b55c7 100644
--- a/benchmark.go
+++ b/benchmark.go
@@ -87,21 +87,45 @@ func Throughput(lt int, lm int, t int, m int) (tput float64) {
 	return
 }
 
+func Utilization(lt int, lct time.Duration, t int, ct time.Duration) (util float64) {
+	util = float64(ct - lct) / float64(t - lt)
+	return
+}
+
+type MinMax struct {
+	Min float64
+	Max float64
+}
+
+func (mm *MinMax) Update(x float64) {
+	if x > mm.Max {
+		mm.Max = x
+	}
+	if x < mm.Min || mm.Min == 0 {
+		mm.Min = x
+	}
+}
+
 type WorkerSummary struct {
-	MaxTput float64
+	MinMaxTput MinMax
+	MinMaxUtil MinMax
 	AvgTput float64
-	MinTput float64
+	AvgUtil float64
 }
 
 type WorkerSetSummary struct {
 	Workers    []WorkerSummary
 	TotalTput     float64
-	MaxTput       float64
 	AvgAvgTput    float64
+	MinMaxTput    MinMax
+	MinMaxAvgTput MinMax
 	AvgStdDevTput float64
-	AvgMaxTput    float64
-	AvgMinTput    float64
-	MinTput       float64
+
+	TotalUtil     float64
+	MinMaxUtil    MinMax
+	MinMaxAvgUtil MinMax
+	AvgAvgUtil    float64
+	AvgStdDevUtil float64
 }
 
 type BenchmarkRunData struct {
@@ -146,8 +170,10 @@ func (run *BenchmarkRun) Process() (err error) {
 
 	type Data struct{
 		startTime int
+		startCputime time.Duration
 		lastTime int
 		lastMops int
+		lastCputime time.Duration
 	}
 	
 	data := make(map[WorkerId]*Data)
@@ -183,24 +209,19 @@ func (run *BenchmarkRun) Process() (err error) {
 			
 		if d.startTime == 0 {
 			d.startTime = e.Now
+			d.startCputime = e.Cputime
 		} else {
 			tput := Throughput(d.lastTime, d.lastMops, e.Now, e.Mops)
-		
-			if tput > s.MaxTput {
-				s.MaxTput = tput
-			}
-			if tput < s.MinTput || s.MinTput == 0 {
-				s.MinTput = tput
-			}
-			if tput > ws.MaxTput {
-				ws.MaxTput = tput
-			}
-			if tput < ws.MinTput || ws.MinTput == 0 {
-				ws.MinTput = tput
-			}
+			util := Utilization(d.lastTime, d.lastCputime, e.Now, e.Cputime)
+
+			s.MinMaxTput.Update(tput)
+			s.MinMaxUtil.Update(util)
+			ws.MinMaxTput.Update(tput)
+			ws.MinMaxUtil.Update(util)
 		}
 		d.lastTime = e.Now
 		d.lastMops = e.Mops
+		d.lastCputime = e.Cputime
 	}
 
 	for Id, d := range data {
@@ -208,45 +229,51 @@ func (run *BenchmarkRun) Process() (err error) {
 		s := &ws.Workers[Id.Id]
 
 		s.AvgTput = Throughput(d.startTime, 0, d.lastTime, d.lastMops)
-		if s.AvgTput > ws.AvgMaxTput {
-			ws.AvgMaxTput = s.AvgTput
-		}
-		if s.AvgTput < ws.AvgMinTput || ws.AvgMinTput == 0 {
-			ws.AvgMinTput = s.AvgTput
-		}
-		
+		s.AvgUtil = Utilization(d.startTime, d.startCputime, d.lastTime, d.lastCputime)
+
+		ws.MinMaxAvgTput.Update(s.AvgTput)
+		ws.MinMaxAvgUtil.Update(s.AvgUtil)
 	}
 
 	// Calculate the average-of-averages for each set
 	for set := range run.Results.Summary {
 		ws := &run.Results.Summary[set]
 		
-		var total float64
+		var totalTput float64
+		var totalUtil float64
 		var count int
 		for id := range ws.Workers {
-			total += ws.Workers[id].AvgTput
+			totalTput += ws.Workers[id].AvgTput
+			totalUtil += ws.Workers[id].AvgUtil
 			count++
 		}
 
 		// FIXME -- Is this legit?
-		ws.TotalTput = total
-		ws.AvgAvgTput = total / float64(count)
+		ws.TotalTput = totalTput
+		ws.TotalUtil = totalUtil
+		ws.AvgAvgTput = totalTput / float64(count)
+		ws.AvgAvgUtil = totalUtil / float64(count)
 	}
 
 	// Then calculate the standard deviation
 	for set := range run.Results.Summary {
 		ws := &run.Results.Summary[set]
 		
-		var total float64
+		var totalAvgTput float64
+		var totalAvgUtil float64
 		var count int
 		
 		for id := range ws.Workers {
-			d := ws.Workers[id].AvgTput - ws.AvgAvgTput
-			total += d * d
+			d1 := ws.Workers[id].AvgTput - ws.AvgAvgTput
+			d2 := ws.Workers[id].AvgUtil - ws.AvgAvgUtil
+			totalAvgTput += d1 * d1
+			totalAvgUtil += d2 * d2
 			count++
 		}
-		v := total / float64(count)
-		ws.AvgStdDevTput = math.Sqrt(v)
+		v1 := totalAvgTput / float64(count)
+		v2 := totalAvgUtil / float64(count)
+		ws.AvgStdDevTput = math.Sqrt(v1)
+		ws.AvgStdDevUtil = math.Sqrt(v2)
 	}
 
 	return
@@ -274,22 +301,26 @@ func (run *BenchmarkRun) TextReport() (err error) {
 		fmt.Printf("Set %d: %s\n", set, params)
 	}
 
-	fmt.Printf("\n%8s %8s %8s %8s %8s %8s %8s %8s\n", "set", "total", "avgavg", "stdev", "avgmax", "avgmin", "totmax", "totmin")
+	fmt.Printf("\n%8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s\n", "set", "ttotal", "tavgavg", "tstdev", "tavgmax", "tavgmin", "ttotmax", "ttotmin", "utotal", "uavgavg", "ustdev", "uavgmax", "uavgmin", "utotmax", "utotmin")
 	for set := range run.WorkerSets {
 		ws := &run.Results.Summary[set]
-		fmt.Printf("%8d %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f\n",
-			set, ws.TotalTput, ws.AvgAvgTput, ws.AvgStdDevTput, ws.AvgMaxTput, ws.AvgMinTput,
-			ws.MaxTput, ws.MinTput)
-		
+		fmt.Printf("%8d %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f\n",
+			set,
+			ws.TotalTput, ws.AvgAvgTput, ws.AvgStdDevTput, ws.MinMaxAvgTput.Max,
+			ws.MinMaxAvgTput.Min, ws.MinMaxTput.Max, ws.MinMaxTput.Min,
+			ws.TotalUtil, ws.AvgAvgUtil, ws.AvgStdDevUtil, ws.MinMaxAvgUtil.Max,
+			ws.MinMaxAvgUtil.Min, ws.MinMaxUtil.Max, ws.MinMaxUtil.Min)
 	}
 
-	if false {
-		fmt.Printf("\n%8s %8s %8s %8s\n", "workerid", "avg", "min", "max")
+	if true {
+		fmt.Printf("\n%8s %8s %8s %8s %8s %8s %8s\n", "workerid", "tavg", "tmin", "tmax", "uavg", "umin", "umax")
 		for set := range run.Results.Summary {
 			for id := range run.Results.Summary[set].Workers {
 				s := run.Results.Summary[set].Workers[id]
-				fmt.Printf("%2d:%2d    %8.2f %8.2f %8.2f\n",
-					set, id, s.AvgTput, s.MinTput, s.MaxTput)
+				fmt.Printf("%2d:%2d    %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f\n",
+					set, id,
+					s.AvgTput, s.MinMaxTput.Min, s.MinMaxTput.Max,
+					s.AvgUtil, s.MinMaxUtil.Min, s.MinMaxUtil.Max)
 			}
 		}
 	}
diff --git a/run.go b/run.go
index 788c541..2a93405 100644
--- a/run.go
+++ b/run.go
@@ -40,8 +40,10 @@ func Report(ws *WorkerState, r WorkerReport) {
 		mops := r.Mops - lr.Mops
 
 		tput := Throughput(lr.Now, lr.Mops, r.Now, r.Mops)
+
+		util := Utilization(lr.Now, lr.Cputime, r.Now, r.Cputime)
 		
-		fmt.Printf("%v Time: %2.3f Mops: %d Tput: %4.2f Cputime: %v\n", r.Id, time, mops, tput, r.Cputime);
+		fmt.Printf("%v Time: %2.3f Mops: %d Tput: %4.2f Cputime: %v Util: %4.2f\n", r.Id, time, mops, tput, r.Cputime, util);
 	}
 
 	ws.LastReport = r
-- 
2.7.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  parent reply	other threads:[~2016-12-29  1:14 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-29  1:13 [PATCH RFC 01/59] Initial controller framework Ronald Rojas
2016-12-29  1:13 ` [PATCH RFC 02/59] controller: Revamp communication structure Ronald Rojas
2016-12-29  1:13 ` [PATCH RFC 03/59] controller: Initial attempt to generalize process / vm creation Ronald Rojas
2016-12-29  1:13 ` [PATCH RFC 04/59] Controller: Move process worker into its own file Ronald Rojas
2016-12-29  1:13 ` [PATCH RFC 05/59] controller: Add WorkerParams argument to Init in Worker interface Ronald Rojas
2016-12-29  1:13 ` [PATCH RFC 06/59] Reorganize to enable "Dist" directory Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 07/59] controller: Introduce basic Xen functionality Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 08/59] controller: Exit after second SIGINT Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 09/59] controller: Refactor creation and stopping of workers into WorkerList methods Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 10/59] controller: First cut at BenchmarkParams Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 11/59] Refactor to move towards benchmark "plans" and data analysis Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 12/59] Basic 'report' functionality Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 13/59] Add GPL headers / COPYING file (v2 only) Ronald Rojas
2016-12-29 10:51   ` Wei Liu
2016-12-29  1:14 ` [PATCH RFC 14/59] benchmark: Store data in terms of worker sets and worker ids Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 15/59] controller: Move "running" code to a separate file Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 16/59] controller: Rename an element in BenchmarkRun to be more accurate Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 17/59] controller: Collect and display statistics on WorkerSets Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 18/59] controller: Add cpupool global config Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 19/59] Add basic libxl framework, get domain cpu_time Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 20/59] xenworker: Use libxl_domain_unpause rather than forking xl Ronald Rojas
2016-12-29  1:14 ` Ronald Rojas [this message]
2016-12-29  1:14 ` [PATCH RFC 22/59] Use tsc for time rather than rumpkernel clock_gettime() Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 23/59] run: Don't collect results reported after command to stop guests is issued Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 24/59] report: Lots of changes Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 25/59] main: Change default workload to something a bit more extreme Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 26/59] Use kops rather than mops Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 27/59] report: Allow report verbosity to be specified Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 28/59] controller: Handle worker early death Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 29/59] report: Add basic html report Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 30/59] htmlreport: Include utilization scatterplots Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 31/59] Make a binary that can run reports on a system without libxl Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 32/59] controller: Allow specification of an input file Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 33/59] controller: Add verbosity argument and update README with new instructions Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 34/59] controller: Make a useful config file Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 35/59] libxl: Add ListCpupool Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 36/59] controller: Make 'dummy' at the level of 'run' rather than xenworker Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 37/59] libxl.go: Provide a single global context by default Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 38/59] controller: Allow multiple schedulers in the same benchmark file Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 39/59] libxl.go: Put common link flags in libxl.go Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 40/59] controller: Add / update GPL text Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 41/59] libxl.go: Link statically rather than dynamically Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 42/59] plan: Allow "templating" from other runs Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 43/59] libxl: Add bitmap support Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 44/59] libxl: Implement CpupoolCreate Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 45/59] libxl: Implement Destroy, Add/Remove operations Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 46/59] libxl: Reorganize bitmapGotoC Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 47/59] libxl: Reorganize code Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 48/59] libxl: Add Ctx.CheckOpen Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 49/59] libxl: Implement libxl_cpupool_info and Scheduler.FromString() Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 50/59] libxl: Fix Bitmap.Max(), make Test() / Clear() more robust Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 51/59] controller: Make and/or modify cpupools when possible Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 52/59] libxl: Implement Bitmap.String() Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 53/59] controller: Add WorkerConfig.SoftAffinity Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 54/59] controller/run: Add RunConfig.NumaDisable Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 55/59] plan: Make the matrix generation more programmatic Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 56/59] controller/plan: Add NumaDisable to SimpleMatrix Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 57/59] tools/blktap2: remove unused inclusion of sys/sysctl.l Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 58/59] remove irrelevant files from old repository Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 59/59] tools/xenlight: Create interface for xenlight info Ronald Rojas
2016-12-29 10:34   ` George Dunlap
2016-12-29 10:52     ` Wei Liu
2016-12-29 13:49       ` Ronald Rojas
2016-12-29 13:45   ` George Dunlap
2016-12-29 20:20     ` George Dunlap
2017-01-03 17:45     ` Ronald Rojas
2017-01-04 16:44       ` George Dunlap

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1482974092-15891-21-git-send-email-ronladred@gmail.com \
    --to=ronladred@gmail.com \
    --cc=dunlapg@umich.edu \
    --cc=george.dunlap@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).