简单说,最常用的有三个:
kern.maxfiles: 最多打开多少个文件,是整个系统中所有进程打开文件总数限制
kern.openfiles: 当前打开了多少个文件,也是整个系统中的,这个数量不能超过maxfiles,否则就会被拒绝,从而导致错误,可以经常监控这个参数,但是这不是唯一的监控变量。
kern.maxfilesperproc: 每个进程最多可以打开多少个文件
在很多WEB的优化策略中,仅仅是优化了kern.maxfiles,一般限制为65535,其实这对于繁忙的系统来说,远远不够,特别是php系统,不仅被读取的文件要打开,nginx要开很多线程对php的socket进行读取,这也计算在打开文件行列,而每个php-fcgi进程,也需要打开对应的.php文件,所以系统中的打开文件数,很轻松就能过几十万。
而对于nginx来说,它主要是线程工作,开的进程不多,面对成千上万的请求,它会开数千、甚至上万个线程来连接php和打开用户请求的文件,这些线程打开的所有文件,会计算在同一个进程内,从而达到同一进程的打开文件数限制,也就是kern.maxfilesperproc,这时在nginx-error.log里会记录下too many files open的错误。
所以遇到too many files open错误的时候,不仅要提高maxfiles,还要提高kern.maxfilesperproc,这样才能提高nginx和php的连接数,如果系统中cpu数量多的话,可以多开向个work,这样可以减少每个进程的打开文件数。
另外php还有一个最大的连接数,也会导致too many files open。