限制容器内文件句柄数

描述

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

用法

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. [root@localhost ~]# 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. [root@localhost ~]# docker run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64
    2. ef9694bf4d8e803a1c7de5c17f5d829db409e41a530a245edc2e5367708dbbab
    3. [root@localhost ~]# 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不会生效,内核也不会报错,容器启动成功。