mirror of https://github.com/docker/cli.git
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:
parent
a2225276af
commit
82600b7021
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue