什么是文件描述符(File descriptor)?
文件描述符简称fd。文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表,用以标明每一个被进程所打开的文件和socket。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。第一个打开的文件是0,第二个是1,依此类推。读写文件也需要使用文件描述符来指定待读写的文件。Unix 操作系统通常给每个进程能打开的文件数量强加一个限制。
在Windows操作系统上,文件描述符被称作文件句柄。Windows服务器打开文件的句柄极限设置为16,384。此数量可以在任务管理器的性能摘要中监视。
linux下,文件描述符分为“用户级限制”和“系统级限制”
用户级:当前shell以及由它启动的进程的资源限制,即:每个用户登录后执行的程序占用文件描述符的总数,使用shell> lsof -u www | wc -l 可查看用户www当前打开文件描述符数量
查看用户级限制:shell> ulimit -n #可以看到本次登录的session其文件描述符的限制,默认一般为1024
临时修改用户级限制:shell> ulimit -HSn 10240 #只对当前的session有效,当断开连接重新连接后更改就失效了。
永久修改用户级限制:shell> vi /etc/security/limits.conf,添加如下内容,其中*代表所有用户(当然,也可以指定某个用户)。保存退出后重新登录,其最大文件描述符已经被永久更改了。
* hard nofile 10240
* soft nofile 10240
把ulimit -HSn 65536放到/etc/rc.d/rc.local让启动时加载,也是一种方法
系统级:限制的所有用户打开文件描述符总数
查看系统级限制:sysctl -a | grep fs.file-max
临时修改系统级限制:sysctl -w fs.file-max=102400
永久修改系统级限制:vi /etc/sysctl.conf,添加fs.file-max=102400,保存退出后使用sysctl -p 命令使其生效。