无法打开流,打开的文件太多 - php 1024 最大限制 - Redhat - 为什么新的限制不起作用?

无法打开流,打开的文件太多 - php 1024 最大限制 - Redhat - 为什么新的限制不起作用?

我在调试 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)

  1. 编辑 /etc/security/limits.conf 并将其添加到文件末尾:
* 硬盘无文件 500000
* 软无文件 500000
root 硬盘 nofile 500000
root 软 nofile 500000
  1. 编辑文件 /etc/sysconfig/httpd 并在末尾添加:
ulimit -n 500000
  1. 重新启动(不知道是否绝对必要)

  2. 答对了!

长答案

事实证明,根据使 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。

相关内容