【问题标题】:Docker Ignores limits.conf (trying to solve "too many open files" error)Docker Ignores limits.conf(试图解决“打开文件过多”错误)
【发布时间】:2014-12-12 11:52:36
【问题描述】:

我正在运行一个处理成千上万个并发 Web 套接字连接的 Web 服务器。为此,在 Debian linux 上(我的基础镜像是 google/debian:wheezy,在 GCE 上运行),打开文件的默认数量设置为 1000,我通常只需将 ulimit 设置为所需的数量(64,000) .

这很好,除了当我对我的应用程序进行 docker 化并部署它时——我发现 docker 有点忽略了限制定义。我尝试了以下方法(全部在主机上,而不是在容器本身上):

MAX=64000
sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"ulimit -c $MAX\" >>  /etc/profile"
ulimit -c $MAX

在做了一些研究后,我发现人们可以通过这样做来解决类似的问题:

sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"

并重新启动/重新启动 docker 服务。

但是,以上所有方法都失败了:当我的应用在容器内运行时出现“打开的文件过多”错误(在没有 docker 的情况下执行以下操作可以解决问题)。

我已尝试在容器内运行ulimit -a 以获取 ulimit 设置是否有效的指示,但这样做会引发错误,提示 ulimit 不是作为 PATH 一部分的可执行文件。

有人遇到过这个问题和/或可以提出一种让 docker 认识到限制的方法吗?

【问题讨论】:

    标签: linux debian docker google-compute-engine ulimit


    【解决方案1】:

    我能够通过以下配置缓解此问题:

    docker机器和宿主机我使用ubuntu 14.04 linux。

    主机机器上你需要:

    • 更新 /etc/security/limits.conf 以包括:* - nofile 64000
    • 添加到您的 /etc/sysctl.conf :fs.file-max = 64000
    • 重启 sysctl : sudo sysctl -p

    【讨论】:

    • 一定要重启Docker daemon服务!
    • 以上内容不太准确。 sysctl 命令应更新为sudo sysctl -p <filename>,在此示例中为sudo sysctl -p /etc/sysctl.conf,因为它旨在从文件重新加载特定参数,它不是所有 sysctl 的全局重新加载并捕获 /etc/sysctl.d/ 文件等。
    【解决方案2】:

    您可以在运行容器时将限制作为参数传递。这样您就不必修改主机的限制并为容器提供过多的权力。方法如下:

    docker run --ulimit nofile=5000:5000 <image-tag>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 2014-02-06
      • 2013-05-11
      相关资源
      最近更新 更多