首页 » PHP教程 » phpwarningfopen技巧_修改Linux FileDescription上限时的误区

phpwarningfopen技巧_修改Linux FileDescription上限时的误区

访客 2024-12-02 0

扫一扫用手机浏览

文章目录 [+]

在Linux系统能同时利用的File Description数是有上限的,系统整体的上限可在/proc/sys/fs/file-max文件里确认,有大量访问的做事器上会修正/etc/sysctl.conf文件来提高上限。

系统能利用的File Description上限之外,还有1个能利用的File Description的上限,而1个进程能利用的默认上限是1024。

phpwarningfopen技巧_修改Linux FileDescription上限时的误区

当超过这个上限时,做事器的系统日志里会涌现以下缺点。

phpwarningfopen技巧_修改Linux FileDescription上限时的误区
(图片来自网络侵删)

[ERROR] ・・・ Unable to open a passive connection: Too many open files in system ・・・ [ERROR] ・・・ failed to open stream: Too many open files ・・・

一样平常我们会利用以下方法修正1个进程可利用的File Description上限数

利用ulimit -n命令暂时修正上限修正/etc/security/limits.conf文件

环境环境:Amazon EC2 t2.micro系统:CentOS 6.5 64位Web:HTTPD2.4PHP:5.3.3

ulimit是什么

ulimit是Shell的built-in命令,掌握给进程分配的各种资源。
(csh是利用limit命令)

用ulimit -n命令可以查看现在的File Description数上限(SoftLimit及HardLimit)。
SoftLimit的值应小于HardLimit的值,并且SoftLimit的值是一样平常用户也可修正。
而HardLimit是只有root用户可以修正。

limits.conf是什么

/etc/security/limits.conf是,PAM认证模块之一的pam_limits的配置文件。
配置文件的格式如下;

<domain> <type> <item> <value>

根据以上格式配置的话

root soft nofile 4096 root hard nofile 4096

即root用户实行的进程的最大File Description数是4096。

pam_limits模块,以session类型定义于PAM的配置文件/etc/pam.d/system-auth里,/etc/pam.d/login、/etc/pam.d/sshd、/etc/pam.d/sudo等多个配置文件以Include形式读取system-auth文件。

因此ulimit -n命令会在用户登录或者发生PAM认证(且在session里pam_limits模块被qeruire)时才会生效。

这就意味着「不进行PAM认证的Daemon类进程的上线,不能在/etc/security/limits.conf文件里修正」。

修正limits.conf后的误区(1)

修正limits.conf文件

# vi /etc/security/limits.conf soft nofile 2048 hard nofile 2048

之后,su(SwitchUser)到root之后,

$ sudo su - Last login: Thu Jul 30 05:03:23 UTC 2015 on pts/0 # ulimit -n 2048

但是用户登录或者su时须要PAM认证(limits.conf配置文件的内容生效),而这和从rc脚本及Daemontools被启动的进程的运行环境是截然不同。

修正limits.conf后的误区(2)

修正limits.conf文件之后,重启Daemon之后会创造不再涌现「Too many open files」缺点了。

例如利用

sudo到root用户时的PAM认证,会使limits.conf文件生效root用户启动httpd时,File Description的上限会被子进程(httpd)继续在脚本里进行httpd的停滞/启动时,httpd进程会继续父进程的File Description上限值httpd进程启动时继续了父进程的上限值

在Apache上限1024系统上,做了个大略的测试

1. 准备一个会同时利用1024个File Description的PHP脚本(index.php)

<?php $fp = array; for ($i = 0; $i

2. 通过Apache访问刚才的index.php文件

array(1100) { [0]=> resource(3) of type (stream) [1]=> resource(4) of type (stream) ~ 省略 ~ resource(1015) of type (stream) [1013]=> resource(1016) of type (stream) [1014]=> bool(false) [1015]=> bool(false) ~ 省略 ~

没有达到1024上限的情由是,httpd进程本身会利用一些File Description。
可利用lsof命令进行查看。

Apache的缺点日志(/var/log/httpd/error_log)里涌现’Too many open files’

[Thu Jul 30 05:08:00.078564 2015] [:error] [pid 1150] [client X.X.X.X:1703] PHP Warning: fopen(index.php): failed to open stream: Too many open files in /var/www/html/index.php on line 4

3. 如下修正limits.conf文件

# vi /etc/security/limits.conf soft nofile 2048 hard nofile 2048

4.

5. 再次通过Apache访问index.php文件,会创造不再涌现’Too many open files’缺点

以下是访问index.php的结果。

array(1100) { [0]=> resource(3) of type (stream) [1]=> resource(4) of type (stream) ~ 省略 ~ resource(1101) of type (stream) [1099]=> resource(1102) of type (stream) }

6. 重启系统

7. 通过Apache访问index.php文件,会创造利用的File Description达到1000旁边时,会涌现’Too many open files’缺点。

手动启动Apache时limits.conf配置文件是有效的,系统重启时是init启动各种Daemon而这时再也没有PAM认证(即limits.conf配置内容无效),Apache会利用系统默认的上限值1024。

小结

修正Daemon类进程的File Description上限时不能利用/etc/security/limits.conf文件。

或者可以把ulimit -n追加到以下文件

daemontools:/service//run文件rc脚本:/etc/init.d/文件

修正上限之后,比如查看Apache进程的FileDescription上限时利用如下命令

# cat /proc/`pgrep httpd | head -1`/limits | grep 'open files' Max open files 1024 4096 files

系统利用File Description的情形,用如下命令查看

# cat /proc/sys/fs/file-nr 576 0 99006

CentOS7开始是Systemd启动各种Daemon,用什么方法修正File Description的上限呢。
测试之后再和大家分享。

标签:

相关文章

今日头条算法岗位面试核心方法与必备知识

大数据、人工智能等技术在各行各业得到了广泛应用。今日头条作为中国领先的资讯平台,其算法技术更是备受关注。今日头条算法岗位面试成为了...

PHP教程 2025-01-31 阅读1 评论0

今日头条算法推送如何打造个化阅读体验

在互联网时代,信息爆炸成为常态,用户获取信息的渠道越来越多,而时间却愈发有限。如何让用户在海量信息中快速找到感兴趣的内容,成为了各...

PHP教程 2025-01-31 阅读0 评论0