优化Linux文件打开最大数

为了防止失控的进程破坏系统的性能,UNIX和Linux会跟踪进程使用的大部分资源,并允许用户和系统管理员使用对进程的资源限制,例如控制某个进程打开的系统文件数、对某个用户打开系统进程数进行限制等,一般限制手段包括软限制和硬限制。

具体说明:

  1. 软限制(soft limit):内核实际执行的限制,任何进程都可以将软限制设置为任意小于或等于对进程限制的硬限制的值、最大线程数(noproc)和文件数(nofile)。
  2. 硬限制(hard limit):可以在任何时候任何进程中设置,但硬限制只能由超级用户修改。

*Linux系统一切皆文件,对Linux进行各种操作,实际就是对文件进行操作,文件可分为普通文件、目录文件、链接文件和设备文件。*而文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其值是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。
Linux系统默认已经打开的文件描述符包括STDIN_FILENO 0表示标准输入、STDOUT_FILENO 1表示标准输出、STDERR_FILENO 2表示标准错误输出,默认打开一个新文件,它的文件描述符为3。每个文件描述符与一个打开文件相对应,不同的文件描述符可以指向同一个文件。相同的文件可以被不同的进程打开,也可以在同一个进程中被多次打开。
Linux系统为每个进程维护了一个文件描述符表,该表的值都是从0开始的,在不同的进程中用户会看到相同的文件描述符,相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。
Linux内核对文件操作,维护了3个数据结构概念:

  1. 进程级的文件描述符表;
  2. 系统级的打开文件描述符表;
  3. 文件系统的i-node表。

其中进程级的描述符表的每一个条目记录了单个文件描述符的相关信息,例如控制文件描述符操作的一组标志及对打开文件句柄的引用。Linux内核对所有打开的文件都维护了一个系统级的描述符表(open file description table)。将描述符表中的记录行称为打开文件句柄(open file handle),一个打开文件句柄存储了与一个打开文件相关的全部信息,详细信息如下:
•当前文件偏移量;
•打开文件时所使用的状态标识;
•文件访问模式;
•与信号驱动相关的设置;
•对该文件i-node对象的引用;
•文件类型和访问权限;
•指针指向该文件所持有的锁列表;
•文件的各种属性。

默认Linux内核对每个用户设置了打开文件最大数为1024,对于高并发网站,是远远不够的,需要将默认值调整到更大,调整方法如下:

  • Linux每个用户打开文件最大数临时设置方法,重启服务器该参数无效,命令行终端执行如下命令:
    ulimit -n 65535
  • Linux每个用户打开文件最大数永久设置方法,将如下代码加入内核限制文件/etc/ security/limits.conf的末尾:
  • soft noproc 65535
  • hard noproc 65535
  • soft nofile 65535
  • hard nofile 65535

上述设置为对每个用户分别设置nofile、noproc最大数,如果需要对Linux整个系统设置文件最大数限制,需要修改/proc/sys/fs/file-max中的值,该值为Linux总文件打开数,例如设置为echo 3865161233>/proc/sys/fs/file-max。

你可能感兴趣的:(优化Linux文件打开最大数)