如何设置全局nofile限制以避免“多个打开文件”错误?

时间:2014-01-03 10:29:01

标签: linux ubuntu linux-kernel upstart

我有一个websocket服务。有错误:“太多打开的文件”,但我已经设置了系统配置:

/etc/security/limits.conf
*               soft    nofile          65000
*               hard    nofile          65000

/etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65000

ulimit -n
//output 6500

所以我认为我的系统配置正确。

我的服务由主管管理,可能是主管限制吗?

由主管检查流程:

cat /proc/815/limits
Max open files            1024                 4096                 files 

检查流程手册开始:

cat /proc/900/limits
Max open files            65000                 65000                 files 

原因是使用主管管理服务。如果我重新启动supervisor并重新启动子进程,那么当启动系统管理程序自动启动时,它是“max open files”ok(65000)但错误(1024)。

可能是主管启动级别太高而系统配置在主管启动时不起作用?

修改

system:ubuntu 12.04 64bit

这不是主管问题,系统重启后所有进程自动启动都没有使用系统配置(最大打开文件= 1024),但重新启动它没问题。

更新

也许问题是:

现在的问题是,如何设置全局nofile限制,因为我不想在我需要的每个upstart脚本中设置nofile限制。

10 个答案:

答案 0 :(得分:9)

通过为文件中的所有用户设置限制来解决此问题:

$ cat /etc/security/limits.d/custom.conf
* hard nofile 550000
* soft nofile 550000

设置限制后重新启动服务器。

非常重要: /etc/security/limits.d/文件夹包含用户特定的限制。在我的情况下hadoop 2(cloudera)相关的限制。这些用户特定限制将覆盖全局限制,因此如果未应用限制,请务必检查文件夹/etc/security/limits.d/和文件/etc/security/limits.conf中的用户特定限制。

注意: 在所有情况下都可以设置用户特定限制。应避免设置全局(*)限制。就我而言,它是一个孤立的环境,只需要从我的实验中消除文件限制问题。

希望这可以节省一些人的头发 - 因为我花了太多时间把头发大块地拉出来!

答案 1 :(得分:9)

我遇到了同样的问题。即使ulimit -Sn显示我的新限制,但运行supervisorctl restart allcat proc文件也没有显示新限制。

问题是supervisord仍有原始限制。因此,它创建的任何子进程仍然具有原始限制。

因此,解决方案是终止并重启supervisord

答案 2 :(得分:5)

尝试编辑 /etc/sysctl.conf 并全局调整限制 例如:

强制限制为100000个文件。

vi /etc/sysctl.conf

附加:

fs.file-max = 100000

保存并关闭文件。用户需要注销并重新登录才能使更改生效,或者只需键入以下命令:

sysctl -p

答案 3 :(得分:5)

对于任何疲惫的google:您可能正在寻找the supervisor config中的minfds设置。此设置似乎对supervisord进程以及子进程都生效。我有许多其他策略,包括在执行实际程序之前启动一个设置限制的shell脚本,但这是唯一有用的。

答案 4 :(得分:3)

您可以通过以下方式找到您的限制:

 cat /proc/sys/fs/file-max

sysctl -a | grep file

在/ proc / sys / fs / file-max文件中更改它,或者使用:

sysctl -w fs.file-max=100000

答案 5 :(得分:2)

luqmaan的回答是我的票,除了一个小警告:*通配符不适用于Ubuntu中的root(如limits.conf的评论中所述)。

如果以root用户身份启动supervisord,则需要显式设置root限制:

vi /etc/security/limits.conf

root soft nofile 65535
root hard nofile 65535

答案 6 :(得分:1)

您可以通过以下方式设置服务限制:

添加:LimitNOFILE=65536 在:/etc/systemd/system/{NameofService}.service

答案 7 :(得分:0)

暂时可以通过以下命令解决:

ulimit -n 2048

其中2048(或您可以根据需要设置)是多个进程(nproc) 要永久解决方案,需要配置两个文件。 对于CentOS / RHEL 5或6

/etc/security/limits.conf
/etc/security/limits.d/90-nproc.conf

对于CentOS / RHEL 7

/etc/security/limits.conf
/etc/security/limits.d/20-nproc.conf

在test是特定用户的两个文件上方添加或修改以下行。

test hard nproc 2048
test soft nproc 16384

soft:可以由用户更改,不超过硬限制 硬:这是超级用户设置的软限制的上限,并由内核强制执行

答案 8 :(得分:0)

prlimit --nofile = softlimit hardlimit 帮了我大忙。

关于软限制和硬限制的一些背景知识:

您可以设置软限制和硬限制。系统不允许 用户超过其硬限制。但是,系统管理员 可以设置用户可以暂时超过的软限制。 软限制必须小于硬限制。

一旦用户超过了软限制,计时器就会开始计时。当计时器 滴答作响,允许用户在软限制之上操作,但 不能超过硬限制。一旦用户低于软限制, 计时器重置。但是,如果用户的使用率仍高于 计时器到期时的软限制,将软限制强制为 硬限制。

参考:https://docs.oracle.com/cd/E19455-01/805-7229/sysresquotas-1/index.html

就我而言,增加软限制可以解决问题。我建议在增加硬性限制之前先与系统管理员联系。

参考prlimit命令语法here。 在设置软限制之前,请确保检查系统的硬限制是什么: prlimit -n 那是您可以设置的最大值。

如果您想将配置永久保存在linux服务器上,则可以像其他人一样建议编辑/etc/security/limits.conf。 如果无法正常工作(在我的服务器中无法编辑),请在.bashrc中进行设置。

答案 9 :(得分:-3)

我认为这与打开的文件无关(它只是错误的错误信息)。应用程序使用的任何端口。 1.尝试使用命令

查找进程ID
ps aux

2。使用命令

终止进程(例如8572)
sudo kill -9 8572

3。再次启动您的应用程序。