Docker.DotNet
Docker.DotNet copied to clipboard
How to calculate the memory usage ?
Hi, using GetContainerStatsAsync
and in the progress response MemoryStats.Usage
i doesn't end with a value approaching what is seen by docker stats.
Should i remove from this the total_cache value and something else ?
Did you compare your results against the Docker docs?
To calculate the values shown by the stats command of the docker cli tool the following formulas can be used:
- used_memory =
memory_stats.usage - memory_stats.stats.cache
- available_memory =
memory_stats.limit
- Memory usage % =
(used_memory / available_memory) * 100.0
- cpu_delta =
cpu_stats.cpu_usage.total_usage - precpu_stats.cpu_usage.total_usage
- system_cpu_delta =
cpu_stats.system_cpu_usage - precpu_stats.system_cpu_usage
- number_cpus =
lenght(cpu_stats.cpu_usage.percpu_usage) or cpu_stats.online_cpus
- CPU usage % =
(cpu_delta / system_cpu_delta) * number_cpus * 100.0
In case it helps, my implementation is like this:
await client.Containers.GetContainerStatsAsync(containerid,
new ContainerStatsParameters() { Stream = false },
new Progress<ContainerStatsResponse>(m =>
{
ulong used_memory = 0;
if(m.MemoryStats.Stats.TryGetValue("cache", out ulong memusedstatscache))
used_memory = m.MemoryStats.Usage - memusedstatscache;
else
used_memory = m.MemoryStats.Usage;
var available_memory = m.MemoryStats.Limit;
var memory_usage_perc = ((double)used_memory / (double)available_memory) * 100.0f;
var cpu_delta = m.CPUStats.CPUUsage.TotalUsage - m.PreCPUStats.CPUUsage.TotalUsage;
var system_cpu_delta = m.CPUStats.SystemUsage - m.PreCPUStats.SystemUsage;
var number_cpus = m.CPUStats.OnlineCPUs;
var cpu_usage_perc = ((double)cpu_delta / (double)system_cpu_delta) * number_cpus *100.0f;
}),
token);
Thank you i'm gonne try it