我在 Debian 上有一个长时间运行的进程。在某个时刻抛出一个错误:
打开的文件过多。
跑步:
ulimit -a
显示:
打开文件(-n)1024
我希望将打开文件的数量增加 2 倍。执行后
ulimit -n 2048
该限制在我的会话结束前一直有效,但不适用于该任务。
我如何才能永久增加打开文件的数量?
答案1
如果您的进程是通过脚本启动的,则可以在执行守护进程之前在脚本中调用 ulimit。
如果您希望增加用户或所有用户的 ulimit,您可以设置在pam_limits
登录时应用的限制。这些限制在 中设置/etc/security/limits.conf
。对于您来说,您可以执行以下操作:
* hard nofile 2048
请注意,“hard” 表示硬限制 - 无法超过且无法更改的限制。用户可以更改软限制(例如,没有 root 权限的人),但不能超出硬限制。
阅读limits.conf
以了解有关使用的更多信息pam_limits
。
答案2
内核中还设置了打开文件的“最大总数”,您可以使用以下命令检查当前设置:
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)
答案3
请注意,如果您通过 start-stop-daemon 运行进程,则在 /etc/security/limits.conf 中设置 ulimits 不起作用。例如,如果您想将 tomcat 的打开文件限制提高到 20000,则需要将这些行添加到/etc/default/tomcat
:
ulimit -Hn 32768
ulimit -Sn 32768
我在 debian 6.0.4 上遇到了这个问题对于其他过程,给出的答案应该有帮助。
答案4
这取决于您如何启动长时间运行的进程。如果它是在启动时启动的(通过 /etc/rcX.d/* 脚本),那么您必须在启动脚本中放置一个 ulimit 调用,因为默认限制是由内核设置的,如果不重新编译,则无法对其进行调整。
/etc/security/limits.conf
如果您使用cron
如下命令来启动它,那么使用可能会有效:
@reboot $HOME/bin/my-program
这应该可行,因为 /etc/pam.d/cron 启用了 pam_limits.so。