我有一个websocket服务。 它很平坦,有错误:“打开的文件太多”,但我已经设置了系统configuration:
/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
所以我认为我的系统configuration是正确的。
我的服务由主pipepipe理,可能是主pipe限制?
检查过程由主pipe开始:
cat /proc/815/limits Max open files 1024 4096 files
检查过程手册开始:
cat /proc/900/limits Max open files 65000 65000 files
原因是用监督pipe理服务。 如果我重新启动pipe理程序并重新启动subprocess,它是“最大打开文件”确定(65000),但错误(1024)当重新启动系统pipe理员自动启动。
可能是pipe理员启动级别太高,系统configuration在pipe理员启动时不工作?
编辑:
系统:Ubuntu 12.04 64bit
这不是pipe理员问题,系统重启后所有进程自动启动都不使用系统configuration(最大打开文件= 1024),但重新启动就可以了。
更新
也许问题是:
现在的问题是,如何设置全局nofile限制,因为我不想在每个我需要的暴发脚本中设置nofile限制。
我有同样的问题。 即使ulimit -Sn
显示我的新限制,运行supervisorctl restart all
并捕获proc文件没有显示新的限制。
问题是supervisord
仍然有原始的限制。 因此,它创建的任何子进程仍然具有原始的限制。
所以,解决办法是杀死并重新启动supervisord
。
通过为文件中的所有用户设置限制来解决此问题:
$ 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
文件中的特定用户限制。
注意:设置用户特定的限制是所有情况下的方法。 应该避免设置全局(*)限制。 在我的情况下,这是一个孤立的环境,只是需要从我的实验中消除文件限制问题。
希望这可以节省一些头发 – 因为我花了太多时间把我的头发块大块!
对任何疲惫的谷歌公司来说:你可能正在寻找监督员配置中的minfds
设置。 这个设置似乎对supervisord过程和孩子都起作用。 我有一些其他的策略,包括启动一个shell脚本,在执行实际程序之前设置限制,但这是唯一的工作。
尝试编辑/etc/sysctl.conf并全局调整限制例如:
强制限制为100000个文件。
vi /etc/sysctl.conf
附加:
fs.file-max = 100000
保存并关闭文件。 用户需要注销并重新登录才能使更改生效或者只需键入以下命令:
sysctl -p
你可以找到你限制:
cat /proc/sys/fs/file-max
或者sysctl -a | grep file
sysctl -a | grep file
在/ proc / sys / fs / file-max文件中更改它,或者使用以下命令:
sysctl -w fs.file-max=100000
luqmaan的答案是我的门票,除了一个小小的警告: *
通配符不适用于Ubuntu的根(如limits.conf
的评论中所述)。
如果以root用户身份启动supervisord
则需要明确设置root的限制:
vi /etc/security/limits.conf
root soft nofile 65535 root hard nofile 65535
你可以这样设置服务的限制:
添加: LimitNOFILE=65536
在:/ /etc/systemd/system/{NameofService}.service
/ LimitNOFILE=65536
我认为这与打开的文件无关(这只是错误的错误信息)。 您的应用程序使用的任何端口。 1.尝试使用命令查找进程ID
ps aux
2.用命令杀死进程(例如8572)
sudo kill -9 8572
3.再次启动您的应用程序。