lotus/cmd/lotus-storage-miner/workers.go

109 lines
3.0 KiB
Go
Raw Normal View History

2020-03-23 12:29:24 +00:00
package main
2020-03-23 14:56:22 +00:00
import (
"fmt"
"sort"
2020-05-01 12:06:19 +00:00
"strings"
"github.com/fatih/color"
"github.com/urfave/cli/v2"
2020-03-23 14:56:22 +00:00
2020-05-01 12:06:19 +00:00
"github.com/filecoin-project/sector-storage/storiface"
"github.com/filecoin-project/lotus/chain/types"
2020-03-23 14:56:22 +00:00
lcli "github.com/filecoin-project/lotus/cli"
)
var workersCmd = &cli.Command{
Name: "workers",
Usage: "interact with workers",
Subcommands: []*cli.Command{
workersListCmd,
},
}
var workersListCmd = &cli.Command{
Name: "list",
Usage: "list workers",
2020-05-01 12:06:19 +00:00
Flags: []cli.Flag{
&cli.BoolFlag{Name: "color"},
},
2020-03-23 14:56:22 +00:00
Action: func(cctx *cli.Context) error {
2020-05-01 12:06:19 +00:00
color.NoColor = !cctx.Bool("color")
2020-03-23 14:56:22 +00:00
nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
stats, err := nodeApi.WorkerStats(ctx)
if err != nil {
return err
}
2020-03-24 23:49:45 +00:00
type sortableStat struct {
id uint64
2020-04-23 22:23:20 +00:00
storiface.WorkerStats
2020-03-24 23:49:45 +00:00
}
st := make([]sortableStat, 0, len(stats))
2020-03-23 14:56:22 +00:00
for id, stat := range stats {
2020-03-24 23:49:45 +00:00
st = append(st, sortableStat{id, stat})
2020-03-23 14:56:22 +00:00
}
sort.Slice(st, func(i, j int) bool {
return st[i].id < st[j].id
})
for _, stat := range st {
gpuUse := "not "
2020-05-01 12:06:19 +00:00
gpuCol := color.FgBlue
2020-03-23 14:56:22 +00:00
if stat.GpuUsed {
2020-05-01 12:06:19 +00:00
gpuCol = color.FgGreen
2020-03-23 14:56:22 +00:00
gpuUse = ""
}
2020-05-01 12:06:19 +00:00
fmt.Printf("Worker %d, host %s\n", stat.id, color.MagentaString(stat.Info.Hostname))
var barCols = uint64(64)
cpuBars := int(stat.CpuUse * barCols / stat.Info.Resources.CPUs)
2020-05-01 19:51:31 +00:00
cpuBar := strings.Repeat("|", cpuBars) + strings.Repeat(" ", int(barCols)-cpuBars)
2020-05-01 12:06:19 +00:00
fmt.Printf("\tCPU: [%s] %d core(s) in use\n", color.GreenString(cpuBar), stat.CpuUse)
2020-05-01 19:51:31 +00:00
ramBarsRes := int(stat.Info.Resources.MemReserved * barCols / stat.Info.Resources.MemPhysical)
ramBarsUsed := int(stat.MemUsedMin * barCols / stat.Info.Resources.MemPhysical)
2020-05-01 12:06:19 +00:00
ramBar := color.YellowString(strings.Repeat("|", ramBarsRes)) +
color.GreenString(strings.Repeat("|", ramBarsUsed)) +
2020-05-01 19:51:31 +00:00
strings.Repeat(" ", int(barCols)-ramBarsUsed-ramBarsRes)
2020-05-01 12:06:19 +00:00
2020-05-01 19:51:31 +00:00
vmem := stat.Info.Resources.MemPhysical + stat.Info.Resources.MemSwap
2020-05-01 12:06:19 +00:00
2020-05-01 19:51:31 +00:00
vmemBarsRes := int(stat.Info.Resources.MemReserved * barCols / vmem)
vmemBarsUsed := int(stat.MemUsedMax * barCols / vmem)
2020-05-01 12:06:19 +00:00
vmemBar := color.YellowString(strings.Repeat("|", vmemBarsRes)) +
color.GreenString(strings.Repeat("|", vmemBarsUsed)) +
2020-05-01 19:51:31 +00:00
strings.Repeat(" ", int(barCols)-vmemBarsUsed-vmemBarsRes)
2020-05-01 12:06:19 +00:00
fmt.Printf("\tRAM: [%s] %d%% %s/%s\n", ramBar,
2020-05-01 19:51:31 +00:00
(stat.Info.Resources.MemReserved+stat.MemUsedMin)*100/stat.Info.Resources.MemPhysical,
types.SizeStr(types.NewInt(stat.Info.Resources.MemReserved+stat.MemUsedMin)),
2020-05-01 12:06:19 +00:00
types.SizeStr(types.NewInt(stat.Info.Resources.MemPhysical)))
fmt.Printf("\tVMEM: [%s] %d%% %s/%s\n", vmemBar,
2020-05-01 19:51:31 +00:00
(stat.Info.Resources.MemReserved+stat.MemUsedMax)*100/vmem,
types.SizeStr(types.NewInt(stat.Info.Resources.MemReserved+stat.MemUsedMax)),
2020-05-01 12:06:19 +00:00
types.SizeStr(types.NewInt(vmem)))
2020-03-23 14:56:22 +00:00
for _, gpu := range stat.Info.Resources.GPUs {
2020-05-01 12:06:19 +00:00
fmt.Printf("\tGPU: %s\n", color.New(gpuCol).Sprintf("%s, %sused", gpu, gpuUse))
2020-03-23 14:56:22 +00:00
}
}
return nil
},
}