Nitul
Nitul

Reputation: 1035

Docker Container CPU usage Monitoring

As per the documentation of docker. We can get CPU usage of docker container with docker stats command. The column CPU % will give the percentage of the host’s CPU the container is using.

Let say I limit the container to use 50% of hosts single CPU. I can specify 50% single CPU core limit by --cpus=0.5 option as per https://docs.docker.com/config/containers/resource_constraints/

How can we get the CPU% usage of container out of allowed CPU core by any docker command? E.g. Out of 50% Single CPU core, 99% is used.

Is there any way to get it with cadvisor or prometheus?

Upvotes: 4

Views: 15820

Answers (1)

anemyte
anemyte

Reputation: 20296

How can we get the CPU% usage of container out of allowed CPU core by any docker command? E.g. Out of 50% Single CPU core, 99% is used.

Docker has docker stats command which shows CPU/Memory usage and few other stats:

CONTAINER ID   NAME                                   CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O         PIDS
c43f085dea8c   foo_test.1.l5haec5oyr36qdjkv82w9q32r   0.00%     11.15MiB / 100MiB     11.15%    7.45kB / 0B      3.29MB / 8.19kB   9

Though it does show memory usage regarding the limit out of the box, there is no such feature for CPU yet. It is possible to solve that with a script that will calculate the value on the fly, but I'd rather chosen the second option.

Is there any way to get it with cadvisor or prometheus?

Yes, there is:

irate(container_cpu_usage_seconds_total{cpu="total"}[1m]) 
/ ignoring(cpu) 
(container_spec_cpu_quota/container_spec_cpu_period)

The first line is a typical irate function that calculates how much of CPU seconds a container has used. It comes with a label cpu="total", which the second part does not have, and that's why there is ignoring(cpu).

The bottom line calculates how many CPU cores a container is allowed to use. There are two metrics:

container_spec_cpu_quota - the actual quota value. The value is computed of a fraction of CPU cores that you've set as the limit and multiplied by container_spec_cpu_period.

container_spec_cpu_period - comes from CFS Scheduler and it is like a unit of the quota value.

I know it may be hard to grasp at first, allow me to explain on an example:

Consider that you have container_spec_cpu_period set to the default value, which is 100,000 microseconds, and container CPU limit is set to half a core (0.5). In this case:

container_spec_cpu_period 100,000
container_spec_cpu_quota  50,000  # =container_spec_cpu_period*0.5

With CPU limit set to two cores you will have this:

container_spec_cpu_quota  200,000

And so by dividing one by another we get the fraction of CPU cores back, which is then used in another division to calculate how much of the limit is used.

Upvotes: 8

Related Questions