Docker.DotNet icon indicating copy to clipboard operation
Docker.DotNet copied to clipboard

How to calculate the memory usage ?

Open JeanRessouche opened this issue 2 years ago • 3 comments

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 ?

JeanRessouche avatar Feb 10 '23 09:02 JeanRessouche

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:

  1. used_memory = memory_stats.usage - memory_stats.stats.cache
  2. available_memory = memory_stats.limit
  3. Memory usage % = (used_memory / available_memory) * 100.0
  4. cpu_delta = cpu_stats.cpu_usage.total_usage - precpu_stats.cpu_usage.total_usage
  5. system_cpu_delta = cpu_stats.system_cpu_usage - precpu_stats.system_cpu_usage
  6. number_cpus = lenght(cpu_stats.cpu_usage.percpu_usage) or cpu_stats.online_cpus
  7. CPU usage % = (cpu_delta / system_cpu_delta) * number_cpus * 100.0

HofmeisterAn avatar Feb 10 '23 09:02 HofmeisterAn

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);

LeeWhite187 avatar Mar 26 '23 11:03 LeeWhite187

Thank you i'm gonne try it

JeanRessouche avatar Apr 04 '23 16:04 JeanRessouche