优化Linux文件打开最大数

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

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

Linux系统一切皆文件,对Linux进行各种操作,实际就是对文件进 行操作,文件可分为普通文件、目录文件、链接文件和设备文件。而文 件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的 索引,其值是一个非负整数(通常是小整数),用于指代被打开的文 件,所有执行I/O操作的系统调用都通过文件描述符。

Linux系统默认已经打开的文件描述符包括STDIN_FILENO 0表示标 准输入、STDOUT_FILENO 1表示标准输出、STDERR_FILENO 2表示 标准错误输出,默认打开一个新文件,它的文件描述符为3。

每个文件描述符与一个打开文件相对应,不同的文件描述符可以指 向同一个文件。相同的文件可以被不同的进程打开,也可以在同一个进 程中被多次打开。

Linux系统为每个进程维护了一个文件描述符表,该表的值都是从0 开始的,在不同的进程中用户会看到相同的文件描述符,相同文件描述 符有可能指向同一个文件,也有可能指向不同的文件。Linux内核对文 件操作,维护了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。

发表评论

后才能评论