我有一个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限制。
答案 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 all
和cat
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)
*
通配符不适用于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.尝试使用命令
查找进程IDps aux
2。使用命令
终止进程(例如8572)sudo kill -9 8572
3。再次启动您的应用程序。