LTS

    Innovation Version

      Container Resource Management

      Description

      You can use namespaces and cgroups to manage container resources. iSula can use cgroup v1 and cgroup v2 to restrict resources. cgroup v2 is an experimental feature and cannot be put into commercial use. When the system is configured to support only cgroup v2 and cgroup v2 is mounted to the /sys/fs/cgroup directory, iSula uses cgroup v2 for resource management. Whether cgroup v1 or cgroup v2 is used to manage container resources, iSula provides the same interface for users to implement resource restriction.

      Sharing Resources

      Description

      Containers or containers and hosts can share namespace information mutually, including PID, network, IPC, and UTS information.

      NOTE: When namespace information is shared with a host, the namespace isolation mechanism is unavailable. As a result, information on the host can be queried and operated in a container, causing security risks. For example, if --pid=host is used to share the PID namespace of a host, information about other processes on the host can be viewed, causing information leakage or even killing the host process. Exercise caution when using the shared host namespace function to ensure security.

      Usage

      When running the isula create/run command, you can set the namespace parameters to share resources. For details, see the following parameter description table.

      Parameters

      You can specify the following parameters when running the isula create/run command:

      Parameter

      Description

      Value Range

      Mandatory or Not

      --pid

      Specifies the PID namespace to be shared.

      [none, host, container:<containerID>]: none indicates that the namespace is not shared. host indicates that the namespace is shared with the host. container:<containerID> indicates that the namespace is shared with the container.

      No

      --net

      Specifies the network namespace to be shared.

      [none, host, container:<containerID>]: none indicates that the namespace is not shared. host indicates that the namespace is shared with the host. container:<containerID> indicates that the namespace is shared with the container.

      No

      --ipc

      Specifies the IPC namespace to be shared.

      [none, host, container:<containerID>]: none indicates that the namespace is not shared. host indicates that the namespace is shared with the host. container:<containerID> indicates that the namespace is shared with the container.

      No

      --uts

      Specifies the UTS namespace to be shared.

      [none, host, container:<containerID>]: none indicates that the namespace is not shared. host indicates that the namespace is shared with the host. container:<containerID> indicates that the namespace is shared with the container.

      No

      Example

      If two containers need to share the same PID namespace, add --pid container:<containerID> when running the container. For example:

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

      Restricting CPU Resources of a Running Container

      Description

      You can set parameters to restrict the CPU resources of a container.

      Usage

      When running the isula create/run command, you can set CPU-related parameters to limit the CPU resources of a container. For details about the parameters and values, see the following table.

      Parameters

      You can specify the following parameters when running the isula create/run command:

      Parameter

      Description

      Value Range

      Mandatory or Not

      --cpu-period

      Limits the CPU CFS period in a container.

      64-bit integer

      No

      --cpu-quota

      Limits the CPU CFS quota in a container.

      64-bit integer

      No

      --cpu-shares

      Limit the CPU share (relative weight) in a container.

      64-bit integer

      No

      --cpu-rt-period

      Limits the real-time CPU period in a container, in microseconds.

      64-bit integer

      No

      --cpu-rt-runtime

      Limits the real-time running time of the CPU in a container, in microseconds.

      64-bit integer

      No

      --cpuset-cpus

      Limits the CPU nodes used by a container.

      Character string. The value is the number of CPUs to be set. For example, the value can be **0-3** or **0,1**.

      .

      No

      --cpuset-mems

      Limits the memory nodes used by cpuset in a container.

      Character string. The value is the number of CPUs to be set. For example, the value can be **0-3** or **0,1**.

      .

      No

      Example

      To restrict a container to use a specific CPU, add --cpuset-cpus number when running the container. For example:

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

      NOTE: You can check whether the configuration is successful. For details, see "Querying Information About a Single Container."

      Restricting the Memory Usage of a Running Container

      Description

      You can set parameters to restrict the memory usage of a container.

      Usage

      When running the isula create/run command, you can set memory-related parameters to restrict memory usage of containers. For details about the parameters and values, see the following table.

      Parameters

      You can specify the following parameters when running the isula create/run command:

      Parameter

      Description

      Value Range

      Mandatory or Not

      --memory

      Specifies the upper limit of the memory usage of a container.

      64-bit integer The value is a non-negative number. The value 0 indicates that no limit is set. The unit can be empty (byte), KB, MB, GB, TB, or PB.

      No

      --memory-reservation

      Specifies the soft upper limit of the memory of a container.

      64-bit integer The value is a non-negative number. The value 0 indicates that no limit is set. The unit can be empty (byte), KB, MB, GB, TB, or PB.

      No

      --memory-swap

      Specifies the upper limit of the swap memory of the container.

      64-bit integer The value can be -1 or a non-negative number. The value -1 indicates no limit, and the value 0 indicates that no limit is set. The unit can be empty (byte), KB, MB, GB, TB, or PB.

      No

      --kernel-memory

      Specifies the upper limit of the kernel memory of the container.

      64-bit integer The value is a non-negative number. The value 0 indicates that no limit is set. The unit can be empty (byte), KB, MB, GB, TB, or PB.

      No

      Example

      To set the upper limit of the memory of a container, add --memory <number>[<unit>] when running the container. For example:

      isula run -tid --memory 1G busybox sh
      

      Restricting I/O Resources of a Running Container

      Description

      You can set parameters to limit the read/write speed of devices in the container.

      Usage

      When running the isula create/run command, you can set --device-read-bps/--device-write-bps <device-path>:<number>[<unit>] to limit the read/write speed of devices in the container.

      Parameters

      When running the isula create/run command, set --device-read/write-bps.

      Parameter

      Description

      Value Range

      Mandatory or Not

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

      Limits the read/write speed of devices in the container.

      64-bit integer The value is a positive integer. The value can be 0, indicating that no limit is set. The unit can be empty (byte), KB, MB, GB, TB, or PB.

      No

      Example

      To limit the read/write speed of devices in the container, add --device-write-bps/--device-read-bps <device-path>:<number>[<unit>] when running the container. For example, to limit the read speed of the device /dev/sda in the container busybox to 1 Mbit/s, run the following command:

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

      To limit the write speed, run the following command:

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

      Restricting the Rootfs Storage Space of a Container

      Description

      When the overlay2 storage driver is used on the EXT4 file system, the file system quota of a single container can be set. For example, the quota of container A is set to 5 GB, and the quota of container B is set to 10 GB.

      This feature is implemented by the project quota function of the EXT4 file system. If the kernel supports this function, use the syscall SYS_IOCTL to set the project ID of a directory, and then use the syscall SYS_QUOTACTL to set the hard limit and soft limit of the corresponding project ID.

      Usage

      1. Prepare the environment.

        Ensure that the file system supports the Project ID and Project Quota attributes, the kernel version is 4.19 or later, and the version of the peripheral package e2fsprogs is 1.43.4-2 or later.

      2. Before mounting overlayfs to a container, set different project IDs for the upper and work directories of different containers and set inheritance options. After overlayfs is mounted to a container, the project IDs and inherited attributes cannot be modified.

      3. Set the quota as a privileged user outside the container.

      4. Add the following configuration to daemon:

        -s overlay2 --storage-opt overlay2.override_kernel_check=true
        
      5. Daemon supports the following options for setting default restrictions for containers:

        --storage-opt overlay2.basesize=128M specifies the default limit. If --storage-opt size is also specified when you run the isula run command, the value of this parameter takes effect. If no size is specified during the daemon process or when you run the isula run command, the size is not limited.

      6. Enable the Project ID and Project Quota attributes of the file system.

        • Format and mount the file system.

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

      Parameters

      When running the create/run command, set --storage-opt.

      Parameter

      Description

      Value Range

      Mandatory or Not

      --storage-opt size=${rootfsSize}

      Restricts the root file system (rootfs) storage space of the container.

      The parsed value of rootfsSize is a positive number expressed in bytes within the int64 range. The default unit is B. You can also set the unit to [kKmMgGtTpP])?[iI]?[bB]?$. (The minimum value is 10G in the device mapper scenario.)

      No

      Example

      In the isula run/create command, use the existing parameter --storage-opt size=value to set the quota. The value is a positive number in the unit of [kKmMgGtTpP]?[iI]?[bB]?. If the value does not contain a unit, the default unit is byte.

      $ [root@localhost ~]# isula run -ti --storage-opt size=10M busybox
      / # df -h
      Filesystem                Size      Used Available Use% Mounted on
      overlay                  10.0M     48.0K     10.0M   0% /
      none                     64.0M         0     64.0M   0% /dev
      none                     10.0M         0     10.0M   0% /sys/fs/cgroup
      tmpfs                    64.0M         0     64.0M   0% /dev
      shm                      64.0M         0     64.0M   0% /dev/shm
      /dev/mapper/vg--data-ext41
                                9.8G     51.5M      9.2G   1% /etc/hostname
      /dev/mapper/vg--data-ext41
                                9.8G     51.5M      9.2G   1% /etc/resolv.conf
      /dev/mapper/vg--data-ext41
                                9.8G     51.5M      9.2G   1% /etc/hosts
      tmpfs                     3.9G         0      3.9G   0% /proc/acpi
      tmpfs                    64.0M         0     64.0M   0% /proc/kcore
      tmpfs                    64.0M         0     64.0M   0% /proc/keys
      tmpfs                    64.0M         0     64.0M   0% /proc/timer_list
      tmpfs                    64.0M         0     64.0M   0% /proc/sched_debug
      tmpfs                     3.9G         0      3.9G   0% /proc/scsi
      tmpfs                    64.0M         0     64.0M   0% /proc/fdthreshold
      tmpfs                    64.0M         0     64.0M   0% /proc/fdenable
      tmpfs                     3.9G         0      3.9G   0% /sys/firmware
      / # 
      / # dd if=/dev/zero of=/home/img bs=1M count=12 && sync
      dm-4: write failed, project block limit reached.
      10+0 records in
      9+0 records out
      10432512 bytes (9.9MB) copied, 0.011782 seconds, 844.4MB/s
      / # df -h | grep overlay
      overlay                  10.0M     10.0M         0 100% /
      / # 
      

      Constraints

      1. The quota applies only to the rw layer.

        The quota of overlay2 is for the rw layer of the container. The image size is not included.

      2. The kernel supports and enables this function.

        The kernel must support the EXT4 project quota function. When running mkfs, add -O quota,project. When mounting the file system, add -o prjquota. If any of the preceding conditions is not met, an error is reported when --storage-opt size=value is used.

        $ [root@localhost ~]# isula run -it --storage-opt size=10Mb busybox df -h
        Error response from daemon: Failed to prepare rootfs with error: time="2019-04-09T05:13:52-04:00" level=fatal msg="error creating read-
        write layer with ID "a4c0e55e82c55e4ee4b0f4ee07f80cc2261cf31b2c2dfd628fa1fb00db97270f": --storage-opt is supported only for overlay over
        xfs or ext4 with 'pquota' mount option"
        
      3. Description of the limit of quota:

        1. If the quota is greater than the size of the partition where user root of iSulad is located, the file system quota displayed by running the df command in the container is the size of the partition where user root of iSulad is located, not the specified quota.
        2. --storage-opt size=0 indicates that the size is not limited and the value cannot be less than 4096. The precision of size is one byte. If the specified precision contains decimal bytes, the decimal part is ignored. For example, if size is set to 0.1, the size is not limited. (The value is restricted by the precision of the floating point number stored on the computer. That is, 0.999999999999999999999999999 is equal to 1. The number of digits 9 may vary according to computers. Therefore, 4095.999999999999999999999999999 is equal to 4096.) Note that running isula inspect displays the original command line specified format. If the value contains decimal bytes, you need to ignore the decimal part.
        3. If the quota is too small, for example,--storage-opt size=4k, the container may fail to be started because some files need to be created for starting the container.
        4. The -o prjquota option is added to the root partition of iSulad when iSulad is started last time. If this option is not added during this startup, the setting of the container with quota created during the last startup does not take effect.
        5. The value range of the daemon quota --storage-opt overlay2.basesize is the same as that of --storage-opt size.
      4. When storage-opt is set to 4 KB, the lightweight container startup is different from that of Docker.

        Use the storage-opt size=4k and image rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest to run the container.

        Docker fails to be started.

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

        The lightweight container is started properly and no error is reported.

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

        During container startup, if you need to create a file in the rootfs directory of the container, the image size exceeds 4 KB, and the quota is set to 4 KB, the file creation will fail.

        When Docker starts the container, it creates more mount points than iSulad to mount some directories on the host to the container, such as /proc/mounts and /dev/shm. If these files do not exist in the image, the creation will fail, therefore, the container fails to be started.

        When a lightweight container uses the default configuration during container startup, there are few mount points. The lightweight container is created only when the directory like /proc or /sys does not exist. The image rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest in the test case contains /proc and /sys. Therefore, no new file or directory is generated during the container startup. As a result, no error is reported during the lightweight container startup. To verify this process, when the image is replaced with rnd-dockerhub.huawei.com/official/busybox-aarch64:latest, an error is reported when the lightweight container is started because /proc does not exist in the image.

        [root@localhost ~]# isula run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/busybox-aarch64:latest
        8e893ab483310350b8caa3b29eca7cd3c94eae55b48bfc82b350b30b17a0aaf4
        Error response from daemon: Start container error: runtime error: 8e893ab483310350b8caa3b29eca7cd3c94eae55b48bfc82b350b30b17a0aaf4:tools/lxc_start.c:main:404 starting container process caused "Failed to setup lxc,
        please check the config file."
        
      5. Other description:

        When using iSulad with the quota function to switch data disks, ensure that the data disks to be switched are mounted using the prjquota option and the mounting mode of the /var/lib/isulad/storage/overlay2 directory is the same as that of the /var/lib/isulad directory.

        NOTE: Before switching the data disk, ensure that the mount point of /var/lib/isulad/storage/overlay2 is unmounted.

      Restricting the Number of File Handles in a Container

      Description

      You can set parameters to limit the number of file handles that can be opened in a container.

      Usage

      When running the isula create/run command, set the --files-limit parameter to limit the number of file handles that can be opened in a container.

      Parameters

      Set the --files-limit parameter when running the isula create/run command.

      Parameter

      Description

      Value Range

      Mandatory or Not

      --files-limit

      Limits the number of file handles that can be opened in a container.

      64-bit integer The value can be 0 or a negative number, but cannot be greater than 2 to the power of 63 minus 1. The value 0 or a negative number indicates no limit.

      During container creation, some handles are opened temporarily. Therefore, the value cannot be too small. Otherwise, the container may not be restricted by the file limit. If the value is less than the number of opened handles, the cgroup file cannot be written. It is recommended that the value be greater than 30.

      No

      Example

      When running the container, add --files-limit n. For example:

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

      Constraints

      1. If the --files-limit parameter is set to a small value, for example, 1, the container may fail to be started.

        [root@localhost ~]# isula run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64
        004858d9f9ef429b624f3d20f8ba12acfbc8a15bb121c4036de4e5745932eff4
        Error response from daemon: Start container error: Container is not running:004858d9f9ef429b624f3d20f8ba12acfbc8a15bb121c4036de4e5745932eff4
        

        Docker will be started successfully, and the value of files.limit cgroup is max.

        [root@localhost ~]# docker run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64
        ef9694bf4d8e803a1c7de5c17f5d829db409e41a530a245edc2e5367708dbbab
        [root@localhost ~]# docker exec -it ef96 cat /sys/fs/cgroup/files/files.limit
        max
        

        The root cause is that the startup principles of the lxc and runc processes are different. After the lxc process creates the cgroup, the files.limit value is set, and then the PID of the container process is written into the cgroup.procs file of the cgroup. At this time, the process has opened more than one handle. As a result, an error is reported, and the startup fails. After you create a cgroup by running the runc command, the PID of the container process is written to the cgroup.procs file of the cgroup, and then the files.limit value is set. Because more than one handle is opened by the process in the cgroup, the file.limit value does not take effect, the kernel does not report any error, and the container is started successfully.

      Restricting the Number of Processes or Threads that Can Be Created in a Container

      Description

      You can set parameters to limit the number of processes or threads that can be created in a container.

      Usage

      When creating or running a container, use the --pids-limit parameter to limit the number of processes or threads that can be created in the container.

      Parameters

      When running the create/run command, set the --pids-limit parameter.

      Parameter

      Description

      Value Range

      Mandatory or Not

      --pids-limit

      Limits the number of file handles that can be opened in a container.

      64-bit integer The value can be 0 or a negative number, but cannot be greater than 2 to the power of 63 minus 1. The value 0 or a negative number indicates no limit.

      No

      Example

      When running the container, add --pids-limit n. For example:

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

      Constraints

      During container creation, some processes are created temporarily. Therefore, the value cannot be too small. Otherwise, the container may fail to be started. It is recommended that the value be greater than 10.

      Configuring the ulimit Value in a Container

      Description

      You can use parameters to control the resources for executed programs.

      Usage

      Set the --ulimit parameter when creating or running a container, or configure the parameter on the daemon to control the resources for executed programs in the container.

      Parameters

      Use either of the following methods to configure ulimit:

      1. When running the isula create/run command, use --ulimit <type>=<soft>[:<hard>] to control the resources of the executed shell program.

        Parameter

        Description

        Value Range

        Mandatory or Not

        --ulimit

        Limits the resources of the executed shell program.

        64-bit integer The value of the soft limit must be less than or equal to that of the hard limit. If only the soft limit is specified, the value of the hard limit is equal to that of the soft limit. Some types of resources do not support negative numbers. For details, see the following table.

        No

      2. Use daemon parameters or configuration files.

        For details, see --default-ulimits in Configuration Mode.

        --ulimit can limit the following types of resources:

        Type

        Description

        Value Range

        core

        limits the core file size (KB)

        64-bit integer, without unit. The value can be 0 or a negative number. The value -1 indicates no limit. Other negative numbers are forcibly converted into a large positive integer.

        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-bit integer, without unit. The value cannot be negative. A negative number is forcibly converted to a large positive number. In addition, "Operation not permitted" is displayed during the setting.

      Example

      When creating or running a container, add --ulimit <type>=<soft>[:<hard>]. For example:

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

      Constraints

      The ulimit cannot be configured in the daemon.json and /etc/sysconfig/iSulad files (or the iSulad command line). Otherwise, an error is reported when iSulad is started.

      Bug Catching

      Buggy Content

      Bug Description

      Submit As Issue

      It's a little complicated....

      I'd like to ask someone.

      PR

      Just a small problem.

      I can fix it online!

      Bug Type
      Specifications and Common Mistakes

      ● Misspellings or punctuation mistakes;

      ● Incorrect links, empty cells, or wrong formats;

      ● Chinese characters in English context;

      ● Minor inconsistencies between the UI and descriptions;

      ● Low writing fluency that does not affect understanding;

      ● Incorrect version numbers, including software package names and version numbers on the UI.

      Usability

      ● Incorrect or missing key steps;

      ● Missing prerequisites or precautions;

      ● Ambiguous figures, tables, or texts;

      ● Unclear logic, such as missing classifications, items, and steps.

      Correctness

      ● Technical principles, function descriptions, or specifications inconsistent with those of the software;

      ● Incorrect schematic or architecture diagrams;

      ● Incorrect commands or command parameters;

      ● Incorrect code;

      ● Commands inconsistent with the functions;

      ● Wrong screenshots.

      Risk Warnings

      ● Lack of risk warnings for operations that may damage the system or important data.

      Content Compliance

      ● Contents that may violate applicable laws and regulations or geo-cultural context-sensitive words and expressions;

      ● Copyright infringement.

      How satisfied are you with this document

      Not satisfied at all
      Very satisfied
      Submit
      Click to create an issue. An issue template will be automatically generated based on your feedback.
      Bug Catching
      编组 3备份