我在调试 PHP 程序中的问题时收到了此消息。
- 我已经编辑了 /etc/security/limits.conf 并添加了
* 硬盘无文件 500000 * 软无文件 500000 root 硬盘 nofile 500000 root 软 nofile 500000
按照此处的说明(https://rtcamp.com/tutorials/linux/increase-open-files-limit/)之后,输入
ulimit -Hn
和
ulimit -Sn
揭示了新的限制:500000。
- 我已经编辑了/etc/pam.d/common-session文件并添加行
会话需要 pam_limits.so
然后我重启了系统。当我的程序尝试打开文件 #1025 时,它仍然抛出异常。
我得到了 php 进程 PID(27263),然后执行了 cat /proc/27263/limits
限制软限制硬限制单位 最大 CPU 时间 无限制 无限制 秒 最大文件大小 无限制 无限制字节数 最大数据大小 无限制 无限制字节数 最大堆栈大小 10485760 无限字节 最大核心文件大小 0 无限字节 最大驻留设置无限制无限制字节数 最大进程数 95124 95124 个进程 最大打开文件数 1024 4096 个文件 最大锁定内存 65536 65536 字节 最大地址空间 无限制 无限制字节数 最大文件锁 无限制 无限制锁 最大待处理信号 95124 95124 个信号 最大消息队列大小 819200 819200 字节 最大优先级 0 0 最大实时优先级 0 0 最大实时超时 无限制 无限制 我们
如您所见,即使设置了这些系统范围的配置,PHP 进程的最大打开文件数仍然有 1024 个限制。
为什么?我该如何改变这种情况?为什么系统范围的设置不适用于这种特殊情况?
谢谢
答案1
简短回答(限制为 500000)
- 编辑 /etc/security/limits.conf 并将其添加到文件末尾:
* 硬盘无文件 500000 * 软无文件 500000 root 硬盘 nofile 500000 root 软 nofile 500000
- 编辑文件 /etc/sysconfig/httpd 并在末尾添加:
ulimit -n 500000
重新启动(不知道是否绝对必要)
答对了!
长答案
事实证明,根据使 ulimits 与 start-stop-daemon 一起工作和此 Red Hat 邮件列表讨论,
limits.conf(5) 是 pam_limits(8) 的配置,它由 PAM 堆栈根据 /etc/pam.d 中的配置激活。但是,从 init.d 脚本启动的 start-stop-daemon(8) 不会通过 PAM 堆栈,因此永远不会应用这些类型的设置。
或者简单地说,
/etc/security/limits.conf 适用于登录,而用户“apache”未登录。
第一个链接中提出的解决方案是编辑 init.d 脚本,并将 ulimit -n 添加到脚本末尾。
但是,正如在第二个链接中看到的,如果您编辑 /etc/init.d/httpd 脚本,系统更新可以覆盖该文件,并且更改会消失。
所以他们建议这里,这里和这里编辑 /etc/sysconfig/httpd 文件并在那里输入命令。
这就是我所做的,现在我得到了我想要的漂亮的 cat /proc/pid/limits:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 10485760 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 500000 500000 processes
Max open files 500000 500000 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 95124 95124 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
并且程序不再崩溃。
顺便说一下,系统是 RHEL Server 6.6。