容器资源管理

资源共享

描述

容器间或者容器与host之间可以共享namespace信息,包括pid, net, ipc, uts。

用法

isula create/run时使用namespace相关的参数共享资源,具体参数见下方参数列表。

参数

create/run时可以指定下列参数。

参数项

参数说明

取值范围

是否必选

—pid

指定要共享的pid namespace

[none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace

—net

指定要共享的net namespace

[none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace

—ipc

指定要共享的ipc namespace

[none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace

—uts

指定要共享的uts namespace

[none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace

示例

如果两个容器需要共享同一个pid namespace,在运行容器时,直接加上—pid container: 即可,如:

  1. isula run -tid --name test_pid busybox sh
  2. isula run -tid --name test --pid container:test_pid busybox sh

限制运行时的CPU资源

描述

可以通过参数限制容器的各项cpu资源值。

用法

isula create/run时使用cpu相关的参数限制容器的各项cpu资源值,具体参数及取值见下方参数列表。

参数

create/run时可以指定下列参数。

参数项

参数说明

取值范围

是否必选

—cpu-period

限制容器中cpu cfs(完全公平调度)周期

64位整数(int64)

—cpu-quota

限制容器中cpu cfs(完全公平调度) 的配额

64位整数(int64)

—cpu-shares

限制容器中cpu相对权重

64位整数(int64)

—cpuset-cpus

限制容器中使用cpu节点

字符串。值为要设置的cpu编号,有效范围为主机上的cpu数量,例如可以设置0-3或者0,1.

—cpuset-mems

限制容器中cpuset使用的mem节点

字符串。值为要设置的cpu编号,有效范围为主机上的cpu数量,例如可以设置0-3或者0,1.

示例

如果需要限制容器只是用特定的cpu,在运行容器时,直接加上—cpuset-cpus number 即可,如:

  1. isula run -tid --cpuset-cpus 0,2-3 busybox sh

容器资源管理 - 图1 说明:
是否设置成功,请参见“查询单个容器信息”章节。

限制运行时的内存

描述

可以通过参数限制容器的各项内存值上限。

用法

isula create/run时使用内存相关的参数限制容器的各项内存使用上限,具体参数及取值见下方参数列表。

参数

create/run时可以指定下列参数。

参数项

参数说明

取值范围

是否必选

—memory

限制容器中内存使用上限

64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.

—memory-reservation

限制容器中内存的软上限

64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.

—memory-swap

限制容器中交换内存的上限

64位整数(int64)。值为-1或非负数,-1表示不限制,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.

—kernel-memory

限制容器中内核内存的上限

64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.

示例

如果需要限制容器内内存的上限,在运行容器时,直接加上—memory []即可,如:

  1. isula run -tid --memory 1G busybox sh

限制运行时的IO资源

描述

可以通过参数限制容器中设备读写速度。

用法

isula create/run时使用—device-read-bps/—device-write-bps :[]来限制容器中设备的读写速度。

参数

create/run时指定—device-read/write-bps参数。

参数项

参数说明

取值范围

是否必选

—device-read-bps/—device-write-bps

限制容器中设备的读速度/写速度

64位整数(int64)。值为正整数,可以为0,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.

示例

如果需要限制容器内设备的读写速度,在运行容器时,直接加上—device-write-bps/—device-read-bps :[]即可,例如,限制容器busybox内设备/dev/sda的读速度为 1MB 每秒,则命令如下:

  1. isula run -tid --device-write /dev/sda:1mb busybox sh

限制写速度的命令如下:

  1. isula run -tid read-bps /dev/sda:1mb busybox sh

限制容器rootfs存储空间

描述

在ext4上使用overlay2时,可以设置单个容器的文件系统限额,比如设置A容器的限额为5G,B容器为10G。

该特性通过ext4文件系统的project quota功能来实现,在内核支持的前提下,通过系统调用SYS_IOCTL设置某个目录的project ID,再通过系统调用SYS_QUOTACTL设置相应的project ID的hard limit和solft limit值达到限额的目的。

用法

  1. 环境准备

    文件系统支持Project ID和Project Quota属性,4.19版本内核已经支持,外围包e2fsprogs版本不低于1.43.4-2。

  2. 在容器挂载overlayfs之前,需要对不同容器的upper目录和work目录设置不同的project id,同时设置继承选项,在容器挂载overlayfs之后不允许再修改project id和继承属性。

  3. 配额的设置需要在容器外以特权用户进行。
  4. daemon中增加如下配置

    1. -s overlay2 --storage-opt overlay2.override_kernel_check=true
  5. daemon支持以下选项,用于为容器设置默认的限制,

    —storage-opt overlay2.basesize=128M 指定默认限制的大小,若isula run时也指定 了—storeage-opt size选项,则以run时指定来生效,若daemon跟isula run时都不指定大小,则表示不限制。

  6. 需要开启文件系统Project ID和Project Quota属性。

    • 新格式化文件系统并mount

      1. # mkfs.ext4 -O quota,project /dev/sdb
      2. # mount -o prjquota /dev/sdb /var/lib/isulad

参数

create/run时指定—storage-opt参数。

参数项

参数说明

取值范围

是否必选

—storage-opt size=${rootfsSize}

限制容器rootfs存储空间。

rootfsSize解析出的大小为int64范围内以字节表示的正数,默认单位为B,也可指定为([kKmMgGtTpP])?[iI]?[bB]?$

示例

在isula run/create命令行上通过已有参数“—storage-opt size=”来设置限额。其中value是一个正数,单位可以是[kKmMgGtTpP]?[iI]?[bB]?,在不带单位的时候默认单位是字节。

  1. # isula run -ti --storage-opt size=10M busybox
  2. / # df -h
  3. Filesystem Size Used Available Use% Mounted on
  4. overlay 10.0M 48.0K 10.0M 0% /
  5. none 64.0M 0 64.0M 0% /dev
  6. none 10.0M 0 10.0M 0% /sys/fs/cgroup
  7. tmpfs 64.0M 0 64.0M 0% /dev
  8. shm 64.0M 0 64.0M 0% /dev/shm
  9. /dev/mapper/vg--data-ext41
  10. 9.8G 51.5M 9.2G 1% /etc/hostname
  11. /dev/mapper/vg--data-ext41
  12. 9.8G 51.5M 9.2G 1% /etc/resolv.conf
  13. /dev/mapper/vg--data-ext41
  14. 9.8G 51.5M 9.2G 1% /etc/hosts
  15. tmpfs 3.9G 0 3.9G 0% /proc/acpi
  16. tmpfs 64.0M 0 64.0M 0% /proc/kcore
  17. tmpfs 64.0M 0 64.0M 0% /proc/keys
  18. tmpfs 64.0M 0 64.0M 0% /proc/timer_list
  19. tmpfs 64.0M 0 64.0M 0% /proc/sched_debug
  20. tmpfs 3.9G 0 3.9G 0% /proc/scsi
  21. tmpfs 64.0M 0 64.0M 0% /proc/fdthreshold
  22. tmpfs 64.0M 0 64.0M 0% /proc/fdenable
  23. tmpfs 3.9G 0 3.9G 0% /sys/firmware
  24. / #
  25. / # dd if=/dev/zero of=/home/img bs=1M count=12 && sync
  26. dm-4: write failed, project block limit reached.
  27. 10+0 records in
  28. 9+0 records out
  29. 10432512 bytes (9.9MB) copied, 0.011782 seconds, 844.4MB/s
  30. / # df -h | grep overlay
  31. overlay 10.0M 10.0M 0 100% /
  32. / #

约束

  1. 限额只针对rw层。

    overlay2的限额是针对容器的rw层的,镜像的大小不计算在内。

  2. 内核支持并使能。

    内核必须支持ext4的project quota功能,并在mkfs的时候要加上-O quota,project,挂载的时候要加上-o prjquota。任何一个不满足,在使用—storage-opt size=时都将报错。

    1. # isula run -it --storage-opt size=10Mb busybox df -h
    2. Error response from daemon: Failed to prepare rootfs with error: time="2019-04-09T05:13:52-04:00" level=fatal msg="error creating read-
    3. write layer with ID "a4c0e55e82c55e4ee4b0f4ee07f80cc2261cf31b2c2dfd628fa1fb00db97270f": --storage-opt is supported only for overlay over
    4. xfs or ext4 with 'pquota' mount option"
  3. 限制额度的说明。

    1. 限制的额度大于isulad的root所在分区的size时,在容器内用df看到的文件系统的额度是isulad的root所在分区的size,而不是设置的限额。
    2. —storage-opt size=0代表不限制,且设置值不能小于4096。size的精度为1个字节,如果指定精度含小数个字节,小数部分被忽略,如指定size=0.1实际等同于size=0不限制。(受计算机存储浮点数精度的限制,即0.999999999999999999999999999与1是等价的,具体的9的个数不同计算机可能存在差异,故设置4095.999999999999999999999999999与4096等价,其它情况类似),注意isula inspect显示原始命令行指定形式,如果含小数字节,需自行忽略小数部分。
    3. 限制的额度过小时,比如—storage-opt size=4k,可能会导致容器无法启动,因为启动容器本身需要创建一些文件。
    4. 上一次启动isulad时,isulad的root所在分区挂载时加了-o prjquota选项,这次启动时不加,那么上一次启动中创建的带quota的容器的设置值不生效。
    5. daemon端配额—storage-opt overlay2.basesize,其取值范围与—storage-opt size相同。
  4. 指定storage-opt为4k时,轻量级容器启动与docker有差异

    使用选项 storage-opt size=4k 和镜像 rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest 运行容器。

    docker启动失败。

    1. # docker run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest
    2. docker: Error response from daemon: symlink /proc/mounts /var/lib/docker/overlay2/e6e12701db1a488636c881b44109a807e187b8db51a50015db34a131294fcf70-init/merged/etc/mtab: disk quota exceeded.
    3. See 'docker run --help'.

    轻量级容器不报错,正常启动

    1. # isula run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest
    2. 636480b1fc2cf8ac895f46e77d86439fe2b359a1ff78486ae81c18d089bbd728
    3. # isula ps
    4. STATUS PID IMAGE COMMAND EXIT_CODE RESTART_COUNT STARTAT FINISHAT RUNTIME ID NAMES
    5. running 17609 rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest /bin/bash 0 0 2 seconds ago - lcr 636480b1fc2c 636480b1fc2cf8ac895f46e77d86439fe2b359a1ff78486ae81c18d089bbd728

    在启动容器的过程中,如果需要在容器的rootfs路径下创建文件,若镜像本身占用的大小超过4k,且此时的quota设置为4k,则创建文件必定失败。

    docker在启动容器的过程中,会比isulad创建更多的挂载点,用于挂载host上的某些路径到容器中,如/proc/mounts, /dev/shm等,如果镜像内本身不存在这些文件,则会创建,根据上述原因该操作会导致文件创建失败,因而容器启动失败。

    轻量级容器在启动容器过程中,使用默认配置时,挂载点较少,如/proc,或/sys等路径不存在时,才会创建。用例中的镜像rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest本身含有/proc, /sys等,因此整个启动容器的过程中,都不会有新文件或路径生成,故轻量级容器启动过程不会报错。为验证这一过程,当把镜像替换为rnd-dockerhub.huawei.com/official/busybox-aarch64:latest时,由于该镜像内无/proc存在,轻量级容器启动一样会报错。

    1. # isula run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/busybox-aarch64:latest
    2. 8e893ab483310350b8caa3b29eca7cd3c94eae55b48bfc82b350b30b17a0aaf4
    3. Error response from daemon: Start container error: runtime error: 8e893ab483310350b8caa3b29eca7cd3c94eae55b48bfc82b350b30b17a0aaf4:tools/lxc_start.c:main:404 starting container process caused "Failed to setup lxc,
    4. please check the config file."
  5. 其他说明。

    使用限额功能的isulad切换数据盘时,需要保证被切换的数据盘使用`prjquota`选项挂载,且/var/lib/isulad/storage/overlay2目录的挂载方式与/var/lib/isulad相同。

    容器资源管理 - 图2 说明:
    切换数据盘时需要保证/var/lib/isulad/storage/overlay2的挂载点被卸载。

限制容器内文件句柄数

描述

可以通过参数限制容器中可以打开的文件句柄数。

用法

isula create/run时使用—files-limit来限制容器中可以打开的文件句柄数。

参数

create/run时指定—files-limit参数。

参数项

参数说明

取值范围

是否必选

—files-limit

限制容器中可以打开的文件句柄数。

64位整数(int64)。可以为0、负,但不能超过2的63 次方减 1,0、负表示不做限制(max)。

由于创建容器的过程中会临时打开一些句柄,所以此值不能设置的太小,不然容器可能不受files limit的限制(如果设置的数小于当前已经打开的句柄数,会导致cgroup文件写不进去),建议大于30。

示例

在运行容器时,直接加上—files-limit n 即可,如:

  1. isula run -ti --files-limit 1024 busybox bash

约束

  1. 使用—files-limit参数传入一个很小的值,如1,可能导致容器启动失败。

    1. # isula run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64
    2. 004858d9f9ef429b624f3d20f8ba12acfbc8a15bb121c4036de4e5745932eff4
    3. Error response from daemon: Start container error: Container is not running:004858d9f9ef429b624f3d20f8ba12acfbc8a15bb121c4036de4e5745932eff4

    而docker会启动成功,其files.limit cgroup值为max。

    1. # docker run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64
    2. ef9694bf4d8e803a1c7de5c17f5d829db409e41a530a245edc2e5367708dbbab
    3. # docker exec -it ef96 cat /sys/fs/cgroup/files/files.limit
    4. max

    根因是lxc和runc启动过程的原理不一样,lxc创建cgroup子组后先设置files.limit值,再将容器进程的PID写入该子组的cgroup.procs文件,此时该进程已经打开超过1个句柄,因而写入报错导致启动失败。runc创建cgroup子组后先将容器进程的PID写入该子组的cgroup.procs文件,再设置files.limit值,此时由于该子组内的进程已经打开超过1个句柄,因而写入files.limit不会生效,内核也不会报错,容器启动成功。

限制容器内可以创建的进程-线程数

描述

可以通过参数限制容器中能够创建的进程/线程数。

用法

在容器create/run时,使用参数—pids-limit来限制容器中可以创建的进程/线程数。

参数

create/run时指定—pids-limit参数。

参数项

参数说明

取值范围

是否必选

—pids-limit

限制容器中可以打开的文件句柄数。

64位整数(int64)。可以为0、负,但不能超过2的63 次方减 1,0、负表示不做限制(max)。

示例

在运行容器时,直接加上—pids-limit n 即可,如:

  1. isula run -ti --pids-limit 1024 busybox bash

约束

由于创建容器的过程中会临时创建一些进程,所以此值不能设置的太小,不然容器可能起不来,建议大于10。

配置容器内的ulimit值

描述

可以通过参数控制执行程序的资源。

用法

在容器create/run时配置—ulimit参数,或通过daemon端配置,控制容器中执行程序的资源。

参数

通过两种方法配置ulimit

  1. isula create/run时使用—ulimit =[:]来控制shell执行程序的资源。

    参数项

    参数说明

    取值范围

    是否必选

    —ulimit

    限制shell执行程序的资源

    soft/hard是64位整数(int64)。soft取值 <= hard取值,如果仅仅指定了soft的取值,则hard=soft。对于某些类型的资源并不支持负数,详见下表

  2. 通过daemon端参数或配置文件

    详见”(命令行参数说明”与”部署方式”的—default-ulimits相关选项。

    —ulimit可以对以下类型的资源进行限制。

    类型

    说明

    取值范围

    core

    limits the core file size (KB)

    64位整数(INT64),无单位。可以为0、负、其中-1表示UNLIMITED,即不做限制,其余的负数会被强制转换为一个大的正整数。

    cpu

    max CPU time (MIN)

    data

    max data size (KB)

    fsize

    maximum filesize (KB)

    locks

    max number of file locks the user can hold

    memlock

    max locked-in-memory address space (KB)

    msgqueue

    max memory used by POSIX message queues (bytes)

    nice

    nice priority

    nproc

    max number of processes

    rss

    max resident set size (KB)

    rtprio

    max realtime priority

    rttime

    realtime timeout

    sigpending

    max number of pending signals

    stack

    max stack size (KB)

    nofile

    max number of open file descriptors

    64位整数(int64),无单位。不可以为负,负数被强转为大数,设置时会出现Operation not permitted

示例

在容器的创建或者运行时,加上—ulimit =[:]即可,如:

  1. isula create/run -tid --ulimit nofile=1024:2048 busybox sh

约束

不能在daemon.json和/etc/sysconfig/iSulad文件(或isulad命令行)中同时配置ulimit限制,否则isulad启动会报错。