Adjusted docker stats memory output

Signed-off-by: Sergey Tryuber <Sergeant007@users.noreply.github.com>
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
This commit is contained in:
Sergey Tryuber 2017-04-27 22:17:47 +04:00 committed by Akihiro Suda
parent a2225276af
commit 82600b7021
2 changed files with 61 additions and 9 deletions

View File

@ -84,7 +84,7 @@ func collect(ctx context.Context, s *formatter.ContainerStats, cli client.APICli
v *types.StatsJSON v *types.StatsJSON
memPercent, cpuPercent float64 memPercent, cpuPercent float64
blkRead, blkWrite uint64 // Only used on Linux blkRead, blkWrite uint64 // Only used on Linux
mem, memLimit, memPerc float64 mem, memLimit float64
pidsStatsCurrent uint64 pidsStatsCurrent uint64
) )
@ -101,18 +101,13 @@ func collect(ctx context.Context, s *formatter.ContainerStats, cli client.APICli
daemonOSType = response.OSType daemonOSType = response.OSType
if daemonOSType != "windows" { if daemonOSType != "windows" {
// MemoryStats.Limit will never be 0 unless the container is not running and we haven't
// got any data from cgroup
if v.MemoryStats.Limit != 0 {
memPercent = float64(v.MemoryStats.Usage) / float64(v.MemoryStats.Limit) * 100.0
}
previousCPU = v.PreCPUStats.CPUUsage.TotalUsage previousCPU = v.PreCPUStats.CPUUsage.TotalUsage
previousSystem = v.PreCPUStats.SystemUsage previousSystem = v.PreCPUStats.SystemUsage
cpuPercent = calculateCPUPercentUnix(previousCPU, previousSystem, v) cpuPercent = calculateCPUPercentUnix(previousCPU, previousSystem, v)
blkRead, blkWrite = calculateBlockIO(v.BlkioStats) blkRead, blkWrite = calculateBlockIO(v.BlkioStats)
mem = float64(v.MemoryStats.Usage) mem = calculateMemUsageUnixNoCache(v.MemoryStats)
memLimit = float64(v.MemoryStats.Limit) memLimit = float64(v.MemoryStats.Limit)
memPerc = memPercent memPercent = calculateMemPercentUnixNoCache(memLimit, mem)
pidsStatsCurrent = v.PidsStats.Current pidsStatsCurrent = v.PidsStats.Current
} else { } else {
cpuPercent = calculateCPUPercentWindows(v) cpuPercent = calculateCPUPercentWindows(v)
@ -126,7 +121,7 @@ func collect(ctx context.Context, s *formatter.ContainerStats, cli client.APICli
ID: v.ID, ID: v.ID,
CPUPercentage: cpuPercent, CPUPercentage: cpuPercent,
Memory: mem, Memory: mem,
MemoryPercentage: memPerc, MemoryPercentage: memPercent,
MemoryLimit: memLimit, MemoryLimit: memLimit,
NetworkRx: netRx, NetworkRx: netRx,
NetworkTx: netTx, NetworkTx: netTx,
@ -227,3 +222,18 @@ func calculateNetwork(network map[string]types.NetworkStats) (float64, float64)
} }
return rx, tx return rx, tx
} }
// calculateMemUsageUnixNoCache calculate memory usage of the container.
// Page cache is intentionally excluded to avoid misinterpretation of the output.
func calculateMemUsageUnixNoCache(mem types.MemoryStats) float64 {
return float64(mem.Usage - mem.Stats["cache"])
}
func calculateMemPercentUnixNoCache(limit float64, usedNoCache float64) float64 {
// MemoryStats.Limit will never be 0 unless the container is not running and we haven't
// got any data from cgroup
if limit != 0 {
return usedNoCache / limit * 100.0
}
return 0
}

View File

@ -0,0 +1,42 @@
package container
import (
"github.com/docker/docker/api/types"
"testing"
)
func TestCalculateMemUsageUnixNoCache(t *testing.T) {
// Given
stats := types.MemoryStats{Usage: 500, Stats: map[string]uint64{"cache": 400}}
// When
result := calculateMemUsageUnixNoCache(stats)
// Then
if result != 100 {
t.Errorf("mem = %d, want 100", result)
}
}
func TestCalculateMemPercentUnixNoCache(t *testing.T) {
// Given
someLimit := float64(100.0)
noLimit := float64(0.0)
used := float64(70.0)
// When and Then
t.Run("Limit is set", func(t *testing.T) {
result := calculateMemPercentUnixNoCache(someLimit, used)
expected := float64(70.0)
if result != expected {
t.Errorf("percent = %f, want %f", result, expected)
}
})
t.Run("No limit, no cgroup data", func(t *testing.T) {
result := calculateMemPercentUnixNoCache(noLimit, used)
expected := float64(0.0)
if result != expected {
t.Errorf("percent = %f, want %f", result, expected)
}
})
}