dotnet / Docker.DotNet

:whale: .NET (C#) Client Library for Docker API
https://www.nuget.org/packages/Docker.DotNet/
MIT License
2.23k stars 381 forks source link

How to calculate the memory usage ? #607

Open JeanRessouche opened 1 year ago

JeanRessouche commented 1 year ago

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 ?

HofmeisterAn commented 1 year ago

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
LeeWhite187 commented 1 year ago

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);
JeanRessouche commented 1 year ago

Thank you i'm gonne try it