Skip to content

Commit

Permalink
tools/benchmark: add flags for pprof to storage put
Browse files Browse the repository at this point in the history
This commit adds flags for profiling with runtime/pprof to storage
put:
- --cpuprof-path: specify a path of CPU profiling result, if it is not
    empty, profiling is activated
- --memprof-path: specify a path of heap profiling result, if it is not
    empty, profiling is activated

Of course, the flags should be added to RootCmd ideally. However,
adding common flags that shared by children command requires the
ongoing PR: spf13/cobra#220 . Therefore this
commit adds the flags to storage put only.
  • Loading branch information
mitake committed Jan 13, 2016
1 parent b83c528 commit 4078689
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
3 changes: 3 additions & 0 deletions tools/benchmark/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ var (
bar *pb.ProgressBar
results chan result
wg sync.WaitGroup

cpuProfPath string

This comment has been minimized.

Copy link
@xiang90

xiang90 Jan 13, 2016

can we also move this to storage-put.go?

memProfPath string
)

func init() {
Expand Down
37 changes: 37 additions & 0 deletions tools/benchmark/cmd/storage-put.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"crypto/rand"
"fmt"
"os"
"runtime/pprof"
"time"

"github.com/coreos/etcd/Godeps/_workspace/src/github.com/spf13/cobra"
Expand Down Expand Up @@ -46,6 +47,11 @@ func init() {
storagePutCmd.Flags().IntVar(&storageKeySize, "key-size", 64, "a size of key (Byte)")
storagePutCmd.Flags().IntVar(&valueSize, "value-size", 64, "a size of value (Byte)")
storagePutCmd.Flags().BoolVar(&txn, "txn", false, "put a key in transaction or not")

// TODO: after the PR https://github.com/spf13/cobra/pull/220 is merged, the below pprof related flags should be moved to RootCmd
storagePutCmd.Flags().StringVar(&cpuProfPath, "cpuprof-path", "", "a path of file for storing cpu profile result")

This comment has been minimized.

Copy link
@xiang90

xiang90 Jan 13, 2016

There should not be a problem for sharing flags, check https://github.com/coreos/etcd/blob/master/tools/benchmark/cmd/root.go#L47-L49. They are shared by all commands.

Or I might mis-understand your points.

storagePutCmd.Flags().StringVar(&memProfPath, "memprof-path", "", "a path of file for storing heap profile result")

}

func createBytesSlice(bytesN, sliceN int) [][]byte {
Expand All @@ -60,6 +66,37 @@ func createBytesSlice(bytesN, sliceN int) [][]byte {
}

func storagePutFunc(cmd *cobra.Command, args []string) {
if cpuProfPath != "" {
f, err := os.Create(cpuProfPath)
if err != nil {
fmt.Fprintln(os.Stderr, "failed to create a file for storing cpu profile result: ", err)
os.Exit(1)
}

err = pprof.StartCPUProfile(f)
if err != nil {
fmt.Fprintln(os.Stderr, "failed to start cpu profile: ", err)
os.Exit(1)
}
defer pprof.StopCPUProfile()
}

if memProfPath != "" {
f, err := os.Create(memProfPath)
if err != nil {
fmt.Fprintln(os.Stderr, "failed to create a file for storing heap profile result: ", err)
os.Exit(1)
}

defer func() {
err := pprof.WriteHeapProfile(f)
if err != nil {
fmt.Fprintln(os.Stderr, "failed to write heap profile result: ", err)
// can do nothing for handling the error
}
}()
}

keys := createBytesSlice(storageKeySize, totalNrKeys)
vals := createBytesSlice(valueSize, totalNrKeys)

Expand Down

0 comments on commit 4078689

Please sign in to comment.