我运行了一个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识别限制的方法吗?
sudo sysctl -p <filename>
,在本例中为sudo sysctl -p /etc/sysctl.conf
,因为它旨在从文件重新加载特定参数,而不是全局重新加载所有sysctl,并捕获/etc/sysctl.d/文件等。 - Illuminatus