维基百科:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者建立一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写每每会围绕着文件描述符展开。html
Linux 系统中,把一切都看作是文件,当进程打开现有文件或建立新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所建立的索引,用来指向被打开的文件,全部执行I/O操做的系统调用都会经过文件描述符。node
每一个文件描述符会与一个打开的文件相对应linux
不一样的文件描述符也可能指向同一个文件nginx
相同的文件能够被不一样的进程打开,也能够在同一个进程被屡次打开web
进程级的文件描述符表网络
系统级的文件描述符表spa
文件系统的i-node表 (转到:阮一峰——理解inode).net
在进程A中,文件描述符1和30都指向了同一个打开的文件句柄(#23),这多是该进程屡次对执行打开
操做设计
进程A中的文件描述符2和进程B的文件描述符2都指向了同一个打开的文件句柄(#73),这种状况有几种可能,1.进程A和进程B多是父子进程关系;2.进程A和进程B打开了同一个文件,且文件描述符相同(低几率事件=_=);3.A、B中某个进程经过UNIX域套接字将一个打开的文件描述符传递给另外一个进程。code
进程A的描述符0和进程B的描述符3分别指向不一样的打开文件句柄,但这些句柄均指向i-node表的相同条目(#1936),换言之,指向同一个文件。发生这种状况是由于每一个进程各自对同一个文件发起了打开请求。同一个进程两次打开同一个文件,也会发生相似状况。
前人的思考,咱们的阶梯,这部分参考自网络:连接
有资源的地方就有战争,“文件描述符”也是一种资源,系统中的每一个进程都须要有“文件描述符”才能进行改变世界的宏图霸业。世界须要秩序,因而就有了“文件描述符限制”的规定。
永久修改用户级限制时有三种设置类型:
soft
指的是当前系统生效的设置值
hard
指的是系统中所能设定的最大值
-
指的是同时设置了 soft 和 hard 的值
命令讲解:
步骤(以nginx为例,*注意权限问题,此示例是在本地环境):
找到须要检查的进程id
如图,找到的进程id为 1367
查看该进程的限制
如图,在 Max open files 那一行,能够看到当前设置中最大文件描述符的数量为1024
查看该进程占用了多少个文件描述符
如图所示,使用了17个文件描述符
实际应用过程当中,若是出现“Too many open files” , 能够经过增大进程可用的文件描述符数量来解决,但每每故事不会这样结束,不少时候,并非由于进程可用的文件描述符过少,而是由于程序bug,打开了大量的文件链接(web链接也会占用文件描述符)而没有释放。程序申请的资源在用完后及时释放,才是解决“Too many open files”的根本之道。