限制CPU资源

  1. 配置轻量级虚拟机CPU运行资源

    对轻量级虚拟机的CPU资源配置即虚拟机运行的vcpu配置,安全容器使用—annotation com.github.containers.virtcontainers.sandbox_cpu配置轻量级虚拟机运行CPU资源,该参数仅可配置在pause容器上:

    1. docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox --annotation com.github.containers.virtcontainers.sandbox_cpu=<cpu-nums> <pause-image> <command>

    举例:

    1. # 启动一个pause容器
    2. docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox --annotation com.github.containers.virtcontainers.sandbox_cpu=4 ubuntu-arm64 bash
    3. be3255a3f66a35508efe419bc52eccd3b000032b9d8c9c62df611d5bdc115954
    4. # 进入容器查看CPU信息,查看CPU个数是否与com.github.containers.virtcontainers.sandbox_cpu配置的CPU个数相等
    5. docker exec be32 lscpu
    6. Architecture: aarch64
    7. Byte Order: Little Endian
    8. CPU(s): 4
    9. On-line CPU(s) list: 0-3
    10. Thread(s) per core: 1
    11. Core(s) per socket: 1
    12. Socket(s): 4

    限制CPU资源 - 图1 说明:
    CPU个数可以设置的最大值为当前OS上可供运行的CPU值(除去隔离核),最小值为0.5个CPU。

  2. 配置容器CPU运行资源

    配置容器CPU运行资源与开源docker容器配置CPU运行资源的方式相同,可以通过docker run命令中CPU资源限制相关的参数进行配置:

    参数

    含义

    —cpu-shares

    设置容器能使用的CPU时间比例。

    —cpus

    设置容器可以使用的 CPU 个数。

    —cpu-period

    设置容器进程的调度周期。

    —cpu-quota

    设置每个容器进程调度周期内能够使用的CPU时间。

    —cpuset-cpus

    设置容器进程可以使用的CPU列表。

    说明:

    安全容器使用 —cpuset-cpus 参数绑定CPU时,CPU的编号不能超过安全容器对应的轻量级虚机中CPU的个数减1(轻量级虚机中CPU的编号从0开始)。

    —cpuset-mems

    设定该容器进程可以访问的内存节点。

    说明:

    安全容器不支持多NUMA架构和配置,使用NUMA memory的—cpuset-mems参数只能配置为0。

  3. 配置CPU热插拔功能

    限制CPU资源 - 图2 说明:
    安全容器CPU热插拔功能需要虚拟化组件qemu支持CPU热插拔。

    kata-runtime配置文件config.toml中enable_cpu_memory_hotplug选项负责开启和禁用CPU和内存热插拔。默认取值为false,表示禁用CPU和内存热插拔功能;取值为true,表示开启CPU和内存热插拔功能。

    kata-runtime中复用了—cpus选项实现了CPU热插拔的功能,通过统计Pod中所有容器的—cpus选项的和,然后确定需要热插多少个CPU到轻量级虚机中。

    举例:

    1. # 启动一个pause容器,轻量级虚机默认分配了1个vcpu
    2. docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox ubuntu bash
    3. 77b40fb72f63b11dd3fcab2f6dabfc7768295fced042af8c7ad9c0286b17d24f
    4. # 查看启动完pause容器后轻量级虚机中CPU个数
    5. docker exec 77b40fb72f6 lscpu
    6. Architecture: x86_64
    7. CPU op-mode(s): 32-bit, 64-bit
    8. Byte Order: Little Endian
    9. CPU(s): 1
    10. On-line CPU(s) list: 0
    11. Thread(s) per core: 1
    12. Core(s) per socket: 1
    13. Socket(s): 1
    14. # 在同一个Pod中启动新的容器并通过--cpus设置容器需要的CPU数量为4
    15. docker run -tid --runtime kata-runtime --network none --cpus 4 --annotation io.kubernetes.docker.type=container --annotation io.kubernetes.sandbox.id=77b40fb72f63b11dd3fcab2f6dabfc7768295fced042af8c7ad9c0286b17d24f ubuntu bash
    16. 7234d666851d43cbdc41da356bf62488b89cd826361bb71d585a049b6cedafd3
    17. # 查看当前轻量级虚机中CPU的个数
    18. docker exec 7234d6668 lscpu
    19. Architecture: x86_64
    20. CPU op-mode(s): 32-bit, 64-bit
    21. Byte Order: Little Endian
    22. CPU(s): 4
    23. On-line CPU(s) list: 0-3
    24. Thread(s) per core: 1
    25. Core(s) per socket: 1
    26. Socket(s): 4
    27. # 删除热插了CPU的容器后,查看轻量级虚机中CPU的个数
    28. docker rm -f 7234d666851d
    29. 7234d666851d
    30. docker exec 77b40fb72f6 lscpu
    31. Architecture: x86_64
    32. CPU op-mode(s): 32-bit, 64-bit
    33. Byte Order: Little Endian
    34. CPU(s): 1
    35. On-line CPU(s) list: 0
    36. Thread(s) per core: 1
    37. Core(s) per socket: 1
    38. Socket(s): 1

    限制CPU资源 - 图3 说明:
    由于pause容器只是一个占位容器没有工作负载,所以轻量级虚机启动时默认分配的1个CPU可以被其它容器共享,因此上面例子中启动的新容器只需要再热插3个CPU到轻量级虚机中即可。

    • 当停止热插了CPU的容器后,启动容器时热插进去的CPU也会被拔出。