Debian上的打开文件过多


15

我在Debian上运行了很长时间。在某个时候抛出错误:

打开的文件太多。

运行:

ulimit -a

显示:

打开文件(-n)1024

我希望将打开文件的数量增加2倍。执行后

ulimit -n 2048

该限制一直有效,直到我的会话结束为止,该限制不适用于该任务。

如何永久增加打开文件的数量?

Answers:


12

如果您的过程是通过脚本启动的,则可以在执行守护程序之前将对ulimit的调用放置在脚本中。

如果您希望增加用户或所有用户的ulimit,则可以设置pam_limits登录时通过应用的限制。这些设置在中/etc/security/limits.conf。就您而言,您可以执行以下操作:

*               hard    nofile             2048

请注意,“硬”表示硬限制-不能超过且不能更改的限制。用户(例如,没有root能力的用户)可以更改软限制,但不能超出硬限制。

阅读以limits.conf获得有关使用的更多信息pam_limits


在限制conf上,我有2行:* soft nofile 4096 * hard nofile 8192无效。
FoxyBOA

测试之后,您已经注销并再次登录?如果您是在本地计算机上尝试,这将意味着直接从X / GNOME / KDE等注销
Daniel Lawson,2009年

是。/etc/security/limits.conf对我不起作用。我将尝试第二种方法。
FoxyBOA

3
/etc/security/limits.conf仅适用于使用pam和pam模块pam_limits的服务(有关每个服务的PAM配置,请参见/etc/pam.d/,尤其是/etc/pam.d/common-*) 。因此,它涉及由sshd的,妊娠糖尿病,登录等,不涉及在启动时启动所有程序创建的所有用户的会话...
拉斐尔赫佐格

我确实说过这样的话,但感谢您澄清一下。OP尚未弄清它是用户正在运行的服务还是进程。
Daniel Lawson

13

内核中还有一个打开文件的“最大总数”,您可以使用以下命令检查当前设置:

cat /proc/sys/fs/file-max 

并使用以下参数设置新值:

echo "104854" > /proc/sys/fs/file-max

如果要保留两次重启之间的配置,请添加

sys.fs.file-max=104854

/etc/sysctl.conf

要检查当前最大文件使用量:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)


我的在这里显示了一些淫秽数字:49152 0 18446744073709551615 。我不明白为什么前两列加起来不等于第三列。如果我有1.8万亿亿美元可用,我不知道如何使用它们。
mlissner '19

4

正如其他人所说,您可以在/etc/security/limits.conf中为每个用户或组应用特定的限制。

注意:ulimit -n显示软限制。

ulimit -H -n 

将向您显示硬限制。

例如,如果您将文件数量从1024增加到4096,这会使ulimit -a和ulimit -n输出相当混乱,因为您希望看到硬限制输出,但是仍然看到1024,这是软限制。限制。

另外,请记住,这些限制是针对每次登录强制执行的,因此请在新的shell中重新登录并检查您的更改,不要期望它们会传播到现有的登录名中。


2

请注意,如果通过start-stop-daemon来运行进程,则在/etc/security/limits.conf中设置ulimits无效。例如,如果要将tomcat的打开文件限制提高到20000,则需要将这些添加到以下行/etc/default/tomcat

ulimit -Hn 32768
ulimit -Sn 32768

我在debian 6.0.4上遇到了这个问题。对于其他进程,给出的答案应该会有所帮助。


1

这取决于您如何开始长时间运行的过程。如果它是在引导时启动的(通过/etc/rcX.d/*脚本),那么您必须在启动脚本中放置一个ulimit调用,因为默认限制是由内核设置的,并且如果不重新编译它是不可调整的。

/etc/security/limits.conf如果您使用cron例如这样的条目来启动它,则使用可以工作:

@reboot $HOME/bin/my-program

那应该起作用,因为/etc/pam.d/cron启用了pam_limits.so。


-1

您可以在/etc/security/limits.conf中添加它

root soft nofile 100000
root hard nofile 100000

保存然后重新启动。


3
这是一个已有5年历史的问题,在这里,有什么新鲜的东西不在人们的认可范围内?
Andrew Schulman 2014年

-2

一个非常好的命令是,ulimit -n但是存在连接过多和打开文件过多的问题:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

我试图清理您的答案,但仍不清楚您要对原始海报问题说什么。您可以尝试进一步清理吗?
slm

这也是的输出ulimit -a,不是ulimit -n
伊凡(Yvan)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.