Linux下的文件描述符
文件描述符是一个简单的整数,用于标识进程打开的每个文件和套接字。 第一个打开的文件是0,第二个是1。 Unix操作系统
通常,会对每个进程可以打开的文件数量施加限制。 此外,unix通常有系统级限制。 在UNIX/Linux平台上,对于控制台
控制台的标准输入(0)、标准输出(1)、标准错误(2)输出也支持3个文件描述符。
对于squid,根据squid的工作方式,文件描述符限制可能会严重影响性能。 到了squid
如果所有文件描述符都消失,则无法接收用户的新连接。 也就是说,将用尽文件描述符并拒绝服务。 对应的文件和套接字,直到部分当前请求完成
被关闭,squid无法接收新请求。 如果squid检测到文件描述符不足,它会发出警告。
在Apache上,使用很多的时候,
如果每台主机使用不同的日志文件,Apache可能会陷入文件描述符(也称为file handles )消失的困境。
Apache在内部使用的文件描述符总数为每个不同的错误日志文件添加一个,每个其他日志文件命令添加一个,再添加10~20个。 Unix操作限制每个进程可以使用的文件描述符的数量。 典型的上限为64个,但可以扩展到较大的硬限制(a large hard-limit )。
linux上的最大文件描述符限制包括两个方面:用户级限制和系统级限制。
查看文件描述符有三种方法。
[ root @ localhost~] # sysctl-a|grep-ifile-max-- color
fs.file-max=392036
[ root @ localhost~] # cat/proc/sys/fs/file-max
392036
[root@localhost ~]# ulimit -n
1024
[root@localhost ~]#
系统级限制: sysctl命令与proc文件系统中显示的值相同。 这是系统级限制,限制所有用户打开的文件描述符总数
用户级别限制: ulimit命令显示用户级别的最大文件描述符限制。 这意味着每个用户登录后运行的程序占用的文件描述符总数不能超过此限制
如何更改文件描述符的值?
1、修改用户级别限制
[ root @ localhost~] # ulimit-shn 10240
[root@localhost ~]# ulimit -n
10240
[root@localhost ~]#
上述修改只在当前会话中起作用,是临时的,如果需要永久修改,请按如下方式进行修改:
[ root @ localhost~] # grep-ve ' ^ $|^ # '/etc/security/limits.conf
*硬件文件4096
[root@localhost ~]#
//缺省配置文件中只有hard选项,soft表示当前系统上的有效设置,hard表示系统上可设置的最大值
[ root @ localhost~] # grep-ve ' ^ $|^ # '/etc/security/limits.conf
*硬件通告10240
* soft nofile 10240
[root@localhost ~]#
//soft=hard soft的限制不能高于hard的限制
2、修正系统限制
[ root @ localhost~] # sysctl-WFS.file-max=400000
fs.file-max=400000
[ root @ localhost~] # echo 350000/proc/sys/fs/file-max//重新启动后失效
[ root @ localhost~] # cat/proc/sys/fs/file-max
350000
[root@localhost ~]#
//以上临时修改文件描述符
将//永久修正fs.file-max=400000添加到/etc/sysctl.conf中,使用sysctl -p即可
以下是从kernel document的文件最大和文件最大参数中摘录的说明
file-max file-nr:
thekernelallocatesfilehandlesdynamically,but as yet it doesn't free them again。
内核可以动态分配文件句柄,但在以前是不会释放的
the value infile-maxdenotesthemaximumnumberoffilehandles
thatthelinuxkernelwillallocate.whenyougetlotsoferrormessages
about running out of file handles,you might want to increase this
极限。
file-max的值是linux内核可以分配的最大文件数。 如果您收到许多错误消息,指出打开的文件数已达到最大值,请尝试增加该值的限制
Historically,thethreevaluesinfile-nrdenotedthenumberof
allocated file handles,thenumberofallocatedbutunusedfilehandles,
andthemaximumnumberoffilehandles.Linux 2.6 always reports 0a s
thenumberoffreefilehandles---- thisisnotanerror,it just means
thatthenumberofallocatedfilehandlesexactlymatchesthenumberof
使用文件句柄。
在kernel 2.6之前的版本中,file-nr
的值由三个部分组成:1.已经分配的文件的文件数;2 .已经分配的列表中未使用的文件的文件数;3 .最大文件的文件数。 但是在kernel
版本2.6中的第二个项目的值始终为0。 这不是错误,而是意味着实际上分配的文件句柄正在被无浪费地使用
参考文档:维基百科