mirror of
https://github.com/minio/mc.git
synced 2025-07-30 07:23:03 +03:00
support perf to execute all speed tests (#4158)
This commit will make `mc support perf <alias>` to execute all performance tests, networking, drive and object speed tests. perf will only have --duration and --verbose flags. The user can still test with 'drive', 'object', and 'net' but they will be hidden for now along with their flags.
This commit is contained in:
@ -18,7 +18,15 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
humanize "github.com/dustin/go-humanize"
|
||||
"github.com/minio/cli"
|
||||
"github.com/minio/madmin-go"
|
||||
"github.com/minio/mc/pkg/probe"
|
||||
"github.com/minio/pkg/console"
|
||||
)
|
||||
|
||||
@ -37,3 +45,91 @@ func mainAdminSpeedtest(ctx *cli.Context) error {
|
||||
console.Infoln("Please use 'mc support perf'")
|
||||
return nil
|
||||
}
|
||||
|
||||
func mainAdminSpeedTestObject(ctx *cli.Context, aliasedURL string) error {
|
||||
client, perr := newAdminClient(aliasedURL)
|
||||
if perr != nil {
|
||||
fatalIf(perr.Trace(aliasedURL), "Unable to initialize admin client.")
|
||||
return nil
|
||||
}
|
||||
|
||||
ctxt, cancel := context.WithCancel(globalContext)
|
||||
defer cancel()
|
||||
|
||||
duration, e := time.ParseDuration(ctx.String("duration"))
|
||||
if e != nil {
|
||||
fatalIf(probe.NewError(e), "Unable to parse duration")
|
||||
return nil
|
||||
}
|
||||
if duration <= 0 {
|
||||
fatalIf(errInvalidArgument(), "duration cannot be 0 or negative")
|
||||
return nil
|
||||
}
|
||||
size, e := humanize.ParseBytes(ctx.String("size"))
|
||||
if e != nil {
|
||||
fatalIf(probe.NewError(e), "Unable to parse object size")
|
||||
return nil
|
||||
}
|
||||
if size < 0 {
|
||||
fatalIf(errInvalidArgument(), "size is expected to be atleast 0 bytes")
|
||||
return nil
|
||||
}
|
||||
concurrent := ctx.Int("concurrent")
|
||||
if concurrent <= 0 {
|
||||
fatalIf(errInvalidArgument(), "concurrency cannot be '0' or negative")
|
||||
return nil
|
||||
}
|
||||
globalPerfTestVerbose = ctx.Bool("verbose")
|
||||
|
||||
// Turn-off autotuning only when "concurrent" is specified
|
||||
// in all other scenarios keep auto-tuning on.
|
||||
autotune := !ctx.IsSet("concurrent")
|
||||
|
||||
resultCh, err := client.Speedtest(ctxt, madmin.SpeedtestOpts{
|
||||
Size: int(size),
|
||||
Duration: duration,
|
||||
Concurrency: concurrent,
|
||||
Autotune: autotune,
|
||||
Bucket: ctx.String("bucket"), // This is a hidden flag.
|
||||
})
|
||||
fatalIf(probe.NewError(err), "Failed to execute performance test")
|
||||
|
||||
if globalJSON {
|
||||
for result := range resultCh {
|
||||
if result.Version == "" {
|
||||
continue
|
||||
}
|
||||
printMsg(speedTestResult{
|
||||
result: &result,
|
||||
})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
done := make(chan struct{})
|
||||
|
||||
p := tea.NewProgram(initSpeedTestUI())
|
||||
go func() {
|
||||
if e := p.Start(); e != nil {
|
||||
os.Exit(1)
|
||||
}
|
||||
close(done)
|
||||
}()
|
||||
|
||||
go func() {
|
||||
var result madmin.SpeedTestResult
|
||||
for result = range resultCh {
|
||||
p.Send(speedTestResult{
|
||||
result: &result,
|
||||
})
|
||||
}
|
||||
p.Send(speedTestResult{
|
||||
result: &result,
|
||||
final: true,
|
||||
})
|
||||
}()
|
||||
|
||||
<-done
|
||||
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user