我在 docker 容器内运行 systemd,并尝试为该服务设置文件描述符数量限制。我将 docker 容器的限制设置为 262k,但由于某种原因,/sbin/init 进程将限制降低到 65k。以下是一个简单的示例:
$ sudo docker run --rm --ulimit nofile=262144:262144 --entrypoint grep centos:7.6.1810 files /proc/1/limits
Max open files 262144 262144 files
$ sudo docker run -d --name test --ulimit nofile=26144:26144 --entrypoint /sbin/init centos:7.6.1810 && sudo docker exec test grep files /proc/1/limits && sudo docker rm -f test
cd9bbe479f4a5b5b4e78421bfc8ef968e5abd5d9703b7f1f1975998e65ab0145
Max open files 26144 26144 files
test
$ sudo docker run -d --name test --ulimit nofile=262144:262144 --entrypoint /sbin/init centos:7.6.1810 && sudo docker exec test grep files /proc/1/limits && sudo docker rm -f test
d5d115a0cc07994b9934a809ac567e3f75994f75e56f88740ccc8f08bcb15d1e
Max open files 65536 65536 files
test
在第一个命令中,我运行了一个简单的 grep 命令,您可以看到它获得了我在容器上设置的 262k 限制。第二个命令我以 26k 限制启动 /sbin/init 进程,然后它继续执行。如果我将限制设置为 >65k(第三个命令),它将被忽略并改为设置为 65k。
由于 init 进程是所有服务的父进程,并且它将 nofile 硬限制设置为 65k,因此我的服务不可能超过 65k(例如,在服务上设置 LimitNOFILE=)。有没有办法阻止 init 设置较低的 nofile 限制?
编辑:第三个命令在我的机器上给出了预期的输出。上面的输出来自 AWS EC2 实例。不确定为什么它不同...
答案1
这与centos:7.7.1908
图像预期的那样工作,所以我猜测 systemd 中已经修复了某些问题。