在Linux系统能同时利用的File Description数是有上限的,系统整体的上限可在/proc/sys/fs/file-max文件里确认,有大量访问的做事器上会修正/etc/sysctl.conf文件来提高上限。
系统能利用的File Description上限之外,还有1个能利用的File Description的上限,而1个进程能利用的默认上限是1024。
当超过这个上限时,做事器的系统日志里会涌现以下缺点。

[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.3ulimit是什么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的上限呢。测试之后再和大家分享。