linux中cgroup限制cpu及内存

  • Server
  • 685 clicked

1. cgroups限制CPU

1.1. 前置工作

  1. 安装

    要使用cgroups来限制CPU,需要在Linux系统中安装cgroups工具,可以使用以下命令来安装:

    sudo apt-get install cgroup-bin

    安装完成后,就可以开始使用cgroups来限制CPU了。

  2. 查看cgroup是否开启

    $cat /boot/config-3.10.0-514.2.2.el7.x86_64 | grep CGROUP
    
    $cat /boot/config-3.10.0-1127.el7.x86_64 | grep  CGROUP
    
    CONFIG_CGROUPS=y
    # CONFIG_CGROUP_DEBUG is not set
    CONFIG_CGROUP_FREEZER=y
    CONFIG_CGROUP_PIDS=y
    CONFIG_CGROUP_DEVICE=y
    CONFIG_CGROUP_CPUACCT=y
    CONFIG_CGROUP_HUGETLB=y
    CONFIG_CGROUP_PERF=y
    CONFIG_CGROUP_SCHED=y
    CONFIG_BLK_CGROUP=y
    # CONFIG_DEBUG_BLK_CGROUP is not set
    CONFIG_NETFILTER_XT_MATCH_CGROUP=m
    CONFIG_NET_CLS_CGROUP=y
    CONFIG_NETPRIO_CGROUP=y

    我们看到 /sys/fs/cgroup 目录中有若干个子目录,我们可以认为这些都是受 cgroups 控制的资源以及这些资源的信息。

    • cpu — 这​​​个​​​子​​​系​​​统​​​使​​​用​​​调​​​度​​​程​​​序​​​提​​​供​​​对​​​ CPU 的​​​ cgroup 任​​​务​​​访​​​问
    • ​blkio — 这​​​个​​​子​​​系​​​统​​​为​​​块​​​设​​​备​​​设​​​定​​​输​​​入​​​/输​​​出​​​限​​​制​​​,比​​​如​​​物​​​理设​​​备(磁​​​盘​​​,固​​​态​​​硬​​​盘​​​,USB 等​​​等)​
    • cpuacct — 这​​​个​​​子​​​系​​​统​​​自​​​动​​​生​​​成​​​ cgroup 中​​​任​​​务​​​所​​​使​​​用​​​的​​​ CPU 报​​​告 ​​​
    • cpuset — 这​​​个​​​子​​​系​​​统​​​为​​​ cgroup 中​​​的​​​任​​​务​​​分​​​配​​​独​​​立​​​ CPU(在​​​多​​​核​​​系​​​统)和​​​内​​​存​​​节​​​点
    • devices — 这​​​个​​​子​​​系​​​统​​​可​​​允​​​许​​​或​​​者​​​拒​​​绝​​​ cgroup 中​​​的​​​任​​​务​​​访​​​问​​​设​​​备
    • memory — 这​​​个​​​子​​​系​​​统​​​设​​​定​​​ cgroup 中​​​任​​​务​​​使​​​用​​​的​​​内​​​存​​​限​​​制​​​,并​​​自​​​动生​​​成​​​​内​​​存​​​资​​​源使用​​​报​​​告

1.2. 限制CPU :修改cpu.cfs_quota_us即可

  1. 创建测试脚本use_cpu.sh

    #!/bin/bash
    x=0
    while [ true ]; do
            x=$x+1
    done;
  2. 在/sys/fs/cgroup/cpu目录下创建文件foo

    [root@k8s-master foo]# ll
    total 0
    -rw-r--r-- 1 root root 0 Nov  6 03:00 cgroup.clone_children
    --w--w--w- 1 root root 0 Nov  6 03:00 cgroup.event_control
    -rw-r--r-- 1 root root 0 Nov  6 03:00 cgroup.procs
    -r--r--r-- 1 root root 0 Nov  6 03:00 cpuacct.stat
    -rw-r--r-- 1 root root 0 Nov  6 03:00 cpuacct.usage
    -r--r--r-- 1 root root 0 Nov  6 03:00 cpuacct.usage_percpu
    -rw-r--r-- 1 root root 0 Nov  6 03:00 cpu.cfs_period_us
    -rw-r--r-- 1 root root 0 Nov  6 03:00 cpu.cfs_quota_us
    -rw-r--r-- 1 root root 0 Nov  6 03:00 cpu.rt_period_us
    -rw-r--r-- 1 root root 0 Nov  6 03:00 cpu.rt_runtime_us
    -rw-r--r-- 1 root root 0 Nov  6 03:00 cpu.shares
    -r--r--r-- 1 root root 0 Nov  6 03:00 cpu.stat
    -rw-r--r-- 1 root root 0 Nov  6 03:00 notify_on_release
    -rw-r--r-- 1 root root 0 Nov  6 03:20 tasks
    
    echo 50000 > cpu.cfs_quota_us
    echo 12345 > /sys/fs/cgroup/cpu/foo/tasks
  3. top查看cpu,控制在50%以内

    cpu

1.3. 通过 cpu share 可以设置容器使用 CPU 的优先级

docker run --name "container_A" -c 1024 ubuntu
docker run --name "container_B" -c 512 ubuntu

container_A 的 cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。

需要特别注意的是,这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 container_A 处于空闲状态,这时,为了充分利用 CPU 资源,container_B 也可以分配到全部可用的 CPU

1.4. 限制cpu配额

参数通过--cpu-period=和--cpu-quota=共同起作用,即介绍上述Cgroups使用的例子。表示在cpu-period时间(默认100ms)内,可用的cpu配额。

示例:

docker run -d --cpu-period=100000 --cpu-quota=250000 --name test-c1 nginx:latest

1.5. 限制cpu可用数量

参数通过--cpus=指定,意思限制可用cpu个数,列如--cpus=2.5表示该容器可使用的cpu个数最多是2.5个,这相当与设置了--cpu-period=100000和 --cpu-quota=250000该指令在docker版本1.13以及以上使用。
示例:

[root@app51 ~]# docker run -d --cpus=2 --name test-c2 nginx:latest
5347269d0974e37af843b303124d8799c6f4336a14f61334d21ce9356b1535bc

1.6. 使用固定的cpu

通过--cpuset-cpus参数指定,表示指定容器运行在某个或某些个固定的cpu上,多个cpu使用逗号隔开。例如四个cpu,0代表第一个cpu,--cpuset-cpus=1,3代表该容器只能运行在第二个或第四个cpu上。查看cpu可以通过cat /proc/cpuinfo查看。

示例:

[root@app51 ~]# docker run -d --cpuset-cpus=1,3 --name test-c3 nginx:latest  
276056fce04982c2de7969ca309560ce60b0ebf960cf7197808616d65aa112d4

2. cgroups限制内存

3. 参考

发表评论

邮箱地址不会被公开。 必填项已用*标注