1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Merge pull request #15005 from WeiZhang555/stats-block

Docker stats: display Block IO stats
This commit is contained in:
Alexander Morozov 2015-07-31 13:59:55 -07:00
commit 6fbacc6edb
5 changed files with 33 additions and 13 deletions

View file

@ -25,6 +25,8 @@ type containerStats struct {
MemoryPercentage float64 MemoryPercentage float64
NetworkRx float64 NetworkRx float64
NetworkTx float64 NetworkTx float64
BlockRead float64
BlockWrite float64
mu sync.RWMutex mu sync.RWMutex
err error err error
} }
@ -66,6 +68,7 @@ func (s *containerStats) Collect(cli *DockerCli, streamStats bool) {
previousCPU = v.PreCpuStats.CpuUsage.TotalUsage previousCPU = v.PreCpuStats.CpuUsage.TotalUsage
previousSystem = v.PreCpuStats.SystemUsage previousSystem = v.PreCpuStats.SystemUsage
cpuPercent = calculateCPUPercent(previousCPU, previousSystem, v) cpuPercent = calculateCPUPercent(previousCPU, previousSystem, v)
blkRead, blkWrite := calculateBlockIO(v.BlkioStats)
s.mu.Lock() s.mu.Lock()
s.CPUPercentage = cpuPercent s.CPUPercentage = cpuPercent
s.Memory = float64(v.MemoryStats.Usage) s.Memory = float64(v.MemoryStats.Usage)
@ -73,6 +76,8 @@ func (s *containerStats) Collect(cli *DockerCli, streamStats bool) {
s.MemoryPercentage = memPercent s.MemoryPercentage = memPercent
s.NetworkRx = float64(v.Network.RxBytes) s.NetworkRx = float64(v.Network.RxBytes)
s.NetworkTx = float64(v.Network.TxBytes) s.NetworkTx = float64(v.Network.TxBytes)
s.BlockRead = float64(blkRead)
s.BlockWrite = float64(blkWrite)
s.mu.Unlock() s.mu.Unlock()
u <- nil u <- nil
if !streamStats { if !streamStats {
@ -110,12 +115,13 @@ func (s *containerStats) Display(w io.Writer) error {
if s.err != nil { if s.err != nil {
return s.err return s.err
} }
fmt.Fprintf(w, "%s\t%.2f%%\t%s / %s\t%.2f%%\t%s / %s\n", fmt.Fprintf(w, "%s\t%.2f%%\t%s / %s\t%.2f%%\t%s / %s\t%s / %s\n",
s.Name, s.Name,
s.CPUPercentage, s.CPUPercentage,
units.HumanSize(s.Memory), units.HumanSize(s.MemoryLimit), units.HumanSize(s.Memory), units.HumanSize(s.MemoryLimit),
s.MemoryPercentage, s.MemoryPercentage,
units.HumanSize(s.NetworkRx), units.HumanSize(s.NetworkTx)) units.HumanSize(s.NetworkRx), units.HumanSize(s.NetworkTx),
units.HumanSize(s.BlockRead), units.HumanSize(s.BlockWrite))
return nil return nil
} }
@ -142,7 +148,7 @@ func (cli *DockerCli) CmdStats(args ...string) error {
fmt.Fprint(cli.out, "\033[2J") fmt.Fprint(cli.out, "\033[2J")
fmt.Fprint(cli.out, "\033[H") fmt.Fprint(cli.out, "\033[H")
} }
io.WriteString(w, "CONTAINER\tCPU %\tMEM USAGE / LIMIT\tMEM %\tNET I/O\n") io.WriteString(w, "CONTAINER\tCPU %\tMEM USAGE / LIMIT\tMEM %\tNET I/O\tBLOCK I/O\n")
} }
for _, n := range names { for _, n := range names {
s := &containerStats{Name: n} s := &containerStats{Name: n}
@ -200,3 +206,15 @@ func calculateCPUPercent(previousCPU, previousSystem uint64, v *types.Stats) flo
} }
return cpuPercent return cpuPercent
} }
func calculateBlockIO(blkio types.BlkioStats) (blkRead uint64, blkWrite uint64) {
for _, bioEntry := range blkio.IoServiceBytesRecursive {
switch strings.ToLower(bioEntry.Op) {
case "read":
blkRead = bioEntry.Value
case "write":
blkWrite = bioEntry.Value
}
}
return
}

View file

@ -15,6 +15,8 @@ func TestDisplay(t *testing.T) {
MemoryPercentage: 100.0 / 2048.0 * 100.0, MemoryPercentage: 100.0 / 2048.0 * 100.0,
NetworkRx: 100 * 1024 * 1024, NetworkRx: 100 * 1024 * 1024,
NetworkTx: 800 * 1024 * 1024, NetworkTx: 800 * 1024 * 1024,
BlockRead: 100 * 1024 * 1024,
BlockWrite: 800 * 1024 * 1024,
mu: sync.RWMutex{}, mu: sync.RWMutex{},
} }
var b bytes.Buffer var b bytes.Buffer
@ -22,7 +24,7 @@ func TestDisplay(t *testing.T) {
t.Fatalf("c.Display() gave error: %s", err) t.Fatalf("c.Display() gave error: %s", err)
} }
got := b.String() got := b.String()
want := "app\t30.00%\t104.9 MB / 2.147 GB\t4.88%\t104.9 MB / 838.9 MB\n" want := "app\t30.00%\t104.9 MB / 2.147 GB\t4.88%\t104.9 MB / 838.9 MB\t104.9 MB / 838.9 MB\n"
if got != want { if got != want {
t.Fatalf("c.Display() = %q, want %q", got, want) t.Fatalf("c.Display() = %q, want %q", got, want)
} }

View file

@ -21,9 +21,9 @@ and network IO metrics.
The following is a sample output from the `docker stats` command The following is a sample output from the `docker stats` command
$ docker stats redis1 redis2 $ docker stats redis1 redis2
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
redis1 0.07% 796 KB / 64 MB 1.21% 788 B / 648 B redis1 0.07% 796 KB / 64 MB 1.21% 788 B / 648 B 3.568 MB / 512 KB
redis2 0.07% 2.746 MB / 64 MB 4.29% 1.266 KB / 648 B redis2 0.07% 2.746 MB / 64 MB 4.29% 1.266 KB / 648 B 12.4 MB / 0 B
The [docker stats](/reference/commandline/stats/) reference page has The [docker stats](/reference/commandline/stats/) reference page has

View file

@ -21,9 +21,9 @@ weight=1
Running `docker stats` on multiple containers Running `docker stats` on multiple containers
$ docker stats redis1 redis2 $ docker stats redis1 redis2
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
redis1 0.07% 796 KB / 64 MB 1.21% 788 B / 648 B redis1 0.07% 796 KB / 64 MB 1.21% 788 B / 648 B 3.568 MB / 512 KB
redis2 0.07% 2.746 MB / 64 MB 4.29% 1.266 KB / 648 B redis2 0.07% 2.746 MB / 64 MB 4.29% 1.266 KB / 648 B 12.4 MB / 0 B
The `docker stats` command will only return a live stream of data for running The `docker stats` command will only return a live stream of data for running

View file

@ -25,6 +25,6 @@ Display a live stream of one or more containers' resource usage statistics
Run **docker stats** with multiple containers. Run **docker stats** with multiple containers.
$ docker stats redis1 redis2 $ docker stats redis1 redis2
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
redis1 0.07% 796 KB / 64 MB 1.21% 788 B / 648 B redis1 0.07% 796 KB / 64 MB 1.21% 788 B / 648 B 3.568 MB / 512 KB
redis2 0.07% 2.746 MB / 64 MB 4.29% 1.266 KB / 648 B redis2 0.07% 2.746 MB / 64 MB 4.29% 1.266 KB / 648 B 12.4 MB / 0 B