cmd/bent: add pgo benchmarking scenario

How to use.

The configuration for PGO measurements is located in the configurations-pgo.toml
file. This file contains two configurations, and you will need both of them.
The first configuration "pgo-generate" is enabled by default. It has a new
field "PgoGen", than contains a name of a sub-directory, where the .prof files
will be put. The second configuration "pgo-use" is disabled by default. This
configuration is needed to use the .prof files that were created during the
first phase. It has a new field "PgoUse", with a sub-directory path to .prof
files.

The usages scenario is the following:

1. Run bent with the configuration "pgo-generate" to create .prof files
2. Disable the configuration "pgo-generate" and enable "pgo-use"
3. Run bent with this configuration. This will be pgo-guided run with
   better performance

Notes: we need two new fields, because PgoGen do not add any option,
but is enables environment variables for cpuprofile script. The PgoUse
option adds the -pgo=<path to prof file> to the build line. Probably we
could avoid a step with enabling/disabling configuration for our comfort,
but I do not know how to set the particular order of configuration launches.

Change-Id: I04adf494a01e62b491cc9afce7eed49b19f9fae5
Reviewed-on: https://go-review.googlesource.com/c/benchmarks/+/565357
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
pull/10/head
Aleksey Markin 2024-02-21 13:36:49 +03:00 committed by David Chase
parent 4309afc65a
commit 6bceba257e
4 changed files with 40 additions and 5 deletions

View File

@ -95,7 +95,7 @@ var copyExes = []string{
var copyConfigs = []string{
"benchmarks-all.toml", "benchmarks-50.toml", "benchmarks-gc.toml", "benchmarks-gcplus.toml", "benchmarks-trial.toml",
"configurations-sample.toml", "configurations-gollvm.toml", "configurations-cronjob.toml", "configurations-cmpjob.toml",
"suites.toml",
"configurations-pgo.toml", "suites.toml",
}
var defaultEnv []string
@ -1002,6 +1002,11 @@ benchmarks_loop:
runEnv = append(runEnv, "BENT_I="+strconv.FormatInt(int64(i), 10))
runEnv = append(runEnv, "BENT_BINARY="+testBinaryName)
if config.PgoGen != "" {
// We want to generate pprof file for using pgo
config.RunWrapper = append(config.RunWrapper, "cpuprofile")
}
configWrapper := wrapperFor(config.RunWrapper)
benchWrapper := wrapperFor(b.RunWrapper)
@ -1032,8 +1037,11 @@ benchmarks_loop:
if root != "" {
cmd.Env = replaceEnv(cmd.Env, "GOROOT", root)
}
cmd.Env = append(cmd.Env, "BENT_DIR="+dirs.wd)
cmd.Env = append(cmd.Env, "BENT_PROFILES="+path.Join(dirs.wd, config.thingBenchName("profiles")))
if config.PgoGen != "" {
// We want to generate pprof file for using pgo
cmd.Env = append(cmd.Env, "BENT_PGO="+path.Join(dirs.wd, config.PgoGen))
}
cmd.Env = append(cmd.Env, runEnv...)
cmd.Env = append(cmd.Env, sliceExpandEnv(config.RunEnv, cmd.Env)...)
@ -1061,8 +1069,11 @@ benchmarks_loop:
cmd.Args = append(cmd.Args, "-e", e)
}
cmd.Args = append(cmd.Args, "-e", "BENT_DIR=/") // TODO this is not going to work well
cmd.Args = append(cmd.Args, "-e", "BENT_PROFILES="+path.Join(dirs.wd, config.thingBenchName("profiles")))
if config.PgoGen != "" {
// We want to generate pprof file for using pgo
cmd.Args = append(cmd.Args, "-e", "BENT_PGO="+path.Join(dirs.wd, config.PgoGen))
}
cmd.Args = append(cmd.Args, container)
cmd.Args = append(cmd.Args, wrappersAndBin...)
cmd.Args = append(cmd.Args, "-test.run="+b.Tests)

View File

@ -0,0 +1,11 @@
[[Configurations]]
Name = "pgo-generate"
Root = "$HOME/work/go/"
PgoGen = "profiles" # Sub-directory where we put profiles
# Disabled = true
[[Configurations]]
Name = "pgo-use"
Root = "$HOME/work/go/"
PgoUse = "profiles" # Sub-directory where we search profiles
Disabled = true

View File

@ -26,6 +26,8 @@ import (
type Configuration struct {
Name string // Short name used for binary names, mention on command line
Root string // Specific Go root to use for this trial
PgoGen string // Name of sub-directory to put profiles for later loading
PgoUse string // Name of sub-directory to take generated profile files
BuildFlags []string // BuildFlags supplied to 'go test -c' for building (e.g., "-p 1")
AfterBuild []string // Array of commands to run, output of all commands for a configuration (across binaries) is collected in <runstamp>.<config>.<cmd>
GcFlags string // GcFlags supplied to 'go test -c' for building
@ -176,6 +178,12 @@ func (config *Configuration) compileOne(bench *Benchmark, cwd string, count int)
// Instead of cleaning the cache, specify -a; cache use changed with 1.20, which made builds take much longer.
cmd.Args = append(cmd.Args, "-a")
cmd.Args = append(cmd.Args, sliceExpandEnv(config.BuildFlags, cmd.Env)...)
if config.PgoUse != "" {
// We want to use pprof file for pgo
cmd.Args = append(cmd.Args, "-pgo="+path.Join(dirs.wd, config.PgoUse, bench.Name+".prof"))
}
if config.GcFlags != "" {
cmd.Args = append(cmd.Args, "-gcflags="+expandEnv(config.GcFlags, cmd.Env))
}

View File

@ -1,7 +1,12 @@
#!/bin/bash
# Run args as command, but run cpuprofile and then pprof to capture test cpuprofile output
pf="${BENT_PROFILES}/${BENT_BINARY}_${BENT_I}.prof"
mkdir -p ${BENT_PROFILES}
if [ -n ${BENT_PGO} ] ; then
pf="${BENT_PGO}/${BENT_BENCH}.prof"
mkdir -p ${BENT_PGO}
else
pf="${BENT_PROFILES}/${BENT_BINARY}_${BENT_I}.prof"
mkdir -p ${BENT_PROFILES}
fi
"$@" -test.cpuprofile="$pf"
echo cpuprofile in "$pf"
if [[ x`which pprof` == x"" ]] ; then