同福

Docker限制容器使用CPU的方法【20210620】

介绍

介绍

福哥在搭建TFLinux的Dockerfile版本的环境的时候遇到了一个问题,虽然一些服务可以通过scale继续动态扩容,但是持久化的服务却不能这样操作,福哥想为服务设置分配的内存上限应该怎么办呢?

CPU

cpuset-cpus

通过cpuset-cpus设置可以使用的CPU的核心,例如:一个4核心的CPU,就会有0、1、2、3四个核心可以使用。

可以设置从服务器全部内核中的任意核心,例如:福哥的虚拟机有4核心,福哥用了第0、1、3三个核心。

docker run -tid --name test -h test --cpuset-cpus="0,1,3" centos

如果是生产服务器的CPU的话内核会比较多,可以设置一个范围,例如:福哥设置了6~8之间的三个核心。

docker run -tid --name test -h test --cpuset-cpus="6-8" centos

cpuset-mems

通过cpuset-mems设置NUMA架构的CPU的内存使用。

使用节点0、1、3上的内存。

docker run -tid --name test -h test --cpuset-mems="0,1,3" centos

使用6~8之间节点上的内存。

docker run -tid --name test -h test --cpuset-mems="6-8" centos

cpus

通过cpus设置一个小数,来表示我们要使用的CPU的最大限制,这个小数的区间为0.01~[最大核心数]。

设置CPU最大使用限制为2.5个核心。

docker run -tid --name test -h test --cpus=2.5 centos

cpu-period & cpu-quota

使用配额方式分配CPU给容器,这里面需要一对参数,cpu-period设置评估周期,cpu-quota设置配额,cpu-quota/cpu-period为实际分配的CPU量,这个商是小数就表示分配的CPU量不足一个vCPU,如果商大于1就表示分配的CPU量超过一个vCPU。

cpu-period设置是一个评估周期,区间在1ms~1s之间。

cpu-quota设置是这个评估周期的内CPU配额。

docker run -tid --name test -h test --cpu-period=1000000 --cpu-quota=1000000 centos

混合

可以将cpuset-cpus和cpu-period、cpu-quota结合起来使用,就是限定在一部分CPU核心里面进行配额调度。

docker run \
-tid \
--name tftest \
-h tftest \
--cpuset-cpus=0 \
--cpu-period=1000000 \
--cpu-quota=500000 \
centos

docker-compose

在docker-compose里面设置CPU参数只能设置cpus参数,这个和docker的cpus参数一致。

# mysql
mysql:
  build:
    dockerfile: Dockerfile
    context: ./image/mysql5.7
  container_name: mysql
  image: tflinux-mysql5.7
  networks:
    - default
    - persist
  expose:
    - 3306
  ports:
    - 3306:3306
  volumes:
    - /tongfu.net/env/mysql-5.7.28/data/:/var/lib/mysql/
  restart: always
  deploy:
    resources:
      limits:
        cpus: '2'
        memory: 512M

总结

福哥今天给童鞋们讲解了关于Docker的容器的CPU的使用限制方法,通过设置合理的CPU配额可以更加有效地发挥服务器的性能,可以让Docker发布的服务更加稳定~~