限制容器内文件句柄数
描述
可以通过参数限制容器中可以打开的文件句柄数。
用法
isula create/run时使用—files-limit来限制容器中可以打开的文件句柄数。
参数
create/run时指定—files-limit参数。
64位整数(int64)。可以为0、负,但不能超过2的63 次方减 1,0、负表示不做限制(max)。 由于创建容器的过程中会临时打开一些句柄,所以此值不能设置的太小,不然容器可能不受files limit的限制(如果设置的数小于当前已经打开的句柄数,会导致cgroup文件写不进去),建议大于30。 |
示例
在运行容器时,直接加上—files-limit n 即可,如:
isula run -ti --files-limit 1024 busybox bash
约束
使用—files-limit参数传入一个很小的值,如1,可能导致容器启动失败。
[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会启动成功,其files.limit cgroup值为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
根因是lxc和runc启动过程的原理不一样,lxc创建cgroup子组后先设置files.limit值,再将容器进程的PID写入该子组的cgroup.procs文件,此时该进程已经打开超过1个句柄,因而写入报错导致启动失败。runc创建cgroup子组后先将容器进程的PID写入该子组的cgroup.procs文件,再设置files.limit值,此时由于该子组内的进程已经打开超过1个句柄,因而写入files.limit不会生效,内核也不会报错,容器启动成功。