How does docker use CPU cores from its host operat

2019-03-09 11:02发布

My understading, based on the fact that Docker is based on LXC, is that Docker containers share various resources from its host operating system. My concern is with CPU cores. Here is a scenario:

  • a host linux OS has 8 cores
  • I have to deploy a set of docker containers on the host OS above.
  • Some of the docker containers that I need to deploy would be better suited to use 2 cores

a) So if I run all of the docker containers on that host, will they consume CPU/cores as needed like if they were being run as normal installed applications on that host OS ?

b) Will the docker container consume its own process and all of the processing that is contained in it will be stuck to that parent process's CPU core ?

c) How can I specify a docker container to use a number of cores ( 4 for example ). I saw there is a -C flag that can point to a core id, but it appears there is no option to specify the container to pick N cores at random.

标签: docker lxc
4条回答
乱世女痞
2楼-- · 2019-03-09 11:53

From ORACLE documentation:

  To control a container's CPU usage, you can use the
  --cpu-period  and --cpu-quota options with the docker 
  create and docker run commands  from version 1.7.0 of Docker onward.

  The --cpu-quota option specifies the number of microseconds 
  that a container has access to CPU resources during a 
  period specified by --cpu-period.
  As the default value of --cpu-period is 100000, setting the 
  value of --cpu-quota to 25000 limits a container to 25% of 
  the CPU resources. By default, a container can use all available CPU resources, 
  which corresponds to a --cpu-quota value of -1.
查看更多
Deceive 欺骗
3楼-- · 2019-03-09 11:54

It might be that things changed in the latest (few) versions. Nowadays you can constrain your docker container with parameters for docker run: The equivalent for the current answer in the new docker version is docker run ubuntu /bin/echo 'Hello world --cpuset-cpus="0-3" However, this will limit the docker process to these CPU, but (please correct me if I am wrong) other containers could also request the same set. A possibly better way would be to use CPU shares.

For more information see https://docs.docker.com/engine/reference/run/

查看更多
女痞
4楼-- · 2019-03-09 11:54

So if I run all of the docker containers on that host, will they consume CPU/cores as needed like if they were being run as normal installed applications on that host OS?

Yes.

CPU

By default, each container’s access to the host machine’s CPU cycles is unlimited. You can set various constraints to limit a given container’s access to the host machine’s CPU cycles.


Will the docker container consume its own process and all of the processing that is contained in it will be stuck to that parent process's CPU core?

Nope.

Docker uses Completely Fair Scheduler for sharing CPU resources among containers. So containers have configurable access to CPU.


How can I specify a docker container to use a number of cores ( 4 for example ). I saw there is a -C flag that can point to a core id, but it appears there is no option to specify the container to pick N cores at random.

It is overconfigurable. There are more cpu options in Docker which you can combine.

--cpus= Specify how much of the available CPU resources a container can use. For instance, if the host machine has two CPUs and you set --cpus="1.5", the container is guaranteed at most one and a half of the CPUs.

--cpuset-cpus Limit the specific CPUs or cores a container can use. A comma-separated list or hyphen-separated range of CPUs a container can use, if you have more than one CPU. The first CPU is numbered 0. A valid value might be 0-3 (to use the first, second, third, and fourth CPU) or 1,3 (to use the second and fourth CPU).

And more...

查看更多
干净又极端
5楼-- · 2019-03-09 11:56

Currently, I don't think docker provides this level of granularity. It doesn't specify how many cores it allocates in its lxc.conf files, so you will get all cores for each docker, potentially (or possibly 1, I'm not 100% sure on that).

However, you could tweak the conf file generated for a given container and set something like

cpuset {
    cpuset.cpus="0-3";
}
查看更多
登录 后发表回答