前言
在linux系统中,所有东西都可以看成是文件,文件又可以分为普通文件,目录文件,链接文件和设备文件。文件描述符是内核为了高效管理已被打开的文件所创建的索引,是一个非负整数用于指代被打开的文件,所有执行I/O操作的系统调用都是通过文件描述符。
程序刚刚启动的时候,0是标准输入,1是标准输出,2是错误输出,如果此时打开一个新的文件,他的文件描述是3。
在运行如es程序时,打开的文件太多就会提示“Too many open files” ,出现这个提示的原因是程序打开的文件连接数量超过系统设定值。因为文件描述符是一个系统重要资源。
查看系统级别最大打开文件数
sysctl -a | grep fs.file-max
于此同时,内核为了不让某一个进程消耗所有的文件资源,他也会对单个进程最大打开文件数做默认值处理(称为用户级别限制),默认值1024。
查看用户级别文件描述符
ulimit -n
修改用户级别限制
在/etc/security/limits.conf文件里添加如下内容:
* soft noproc 11000 #限制单个进程最大文件句柄数(到达此限制时系统报警)
* hard noproc 11000 #限制单个进程最大文件句柄数(到达此限制时系统报错)
* soft nofile 65535
* hard nofile 65535
注意:soft的数值应该是小于或等于hard值,soft的限制不能比hard限制高。
- nofile 表示单个进程可以打开的最大文件句柄数
- nproc 表示单个用户创建的进程数
修改系统级别限制
修改系统限制可以吧fs.file-max=419430 添加到/etc/sysctl.conf中,使用sysctl -p 即不需要重启系统也可以生效。
echo "fs.file-max=419430" >> /etc/sysctl.conf
sysctl -p
- 用户级别限制:ulimit命令看到的是用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制。
- 系统级别限制:sysctl命令和proc文件系统中查看到的数据是一样的,这属于系统级别限制,他限制所有用户打开文件描述符的总和。
另外,ulimit -n命令不能真正看到文件的最大文件打开数,用如下脚本查看:
#!/bin/bash for pid in `ps aux | grep nginx | grep -v grep | awk '{print $2}'` do cat /proc/${pid}/limits | grep 'Max open files' done