Linux下文件描述符

http://blog.csdn.net/kumu_linux/article/details/7877770

文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix通常有一个系统级的限制。在UNIX/Linux平台上,对于控制台(Console)的标准输入(0),标准输出(1),标准错误(2)输出也对应了三个文件描述符。

对于squid,因为squid 的工作方式,文件描述符的限制可能会极大的影响性能。当squid 用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。直到一部分当前请求完成,相应的文件和socket 被关闭,squid不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。

对于Apache,当使用了很多虚拟主机,而每个主机又使用了不同的日志文件时,Apache可能会遭遇耗尽文件描述符(有时也称为file handles)的困境。 Apache使用的文件描述符总数如下:每个不同的错误日志文件一个、 每个其他日志文件指令一个、再加10~20个作为内部使用。Unix操作系统限制了每个进程可以使用的文件描述符数量。典型上限是64个,但可以进行扩充,直至到达一个很大的硬限制为止(a large hard-limit)。

linux下最大文件描述符的限制有两个方面,一个是用户级的限制,另外一个则是系统级限制。

以下是查看Linux文件描述符的三种方式:

[[email protected] ~]# sysctl -a | grep -i file-max --color

fs.file-max = 392036

[[email protected] ~]# cat /proc/sys/fs/file-max

392036

[[email protected] ~]# ulimit -n

1024

[[email protected] ~]#

系统级限制:sysctl命令和proc文件系统中查看到的数值是一样的,这属于系统级限制,它是限制所有用户打开文件描述符的总和

用户级限制:ulimit命令看到的是用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制

如何修改文件描述符的值?

1、修改用户级限制

[[email protected] ~]# ulimit-SHn 10240

[[email protected] ~]# ulimit  -n

10240

[[email protected] ~]#

以上的修改只对当前会话起作用,是临时性的,如果需要永久修改,则要修改如下:

[[email protected] ~]# grep -vE‘^$|^#‘ /etc/security/limits.conf

*                hard nofile                  4096

[[email protected] ~]#

//默认配置文件中只有hard选项,soft 指的是当前系统生效的设置值,hard 表明系统中所能设定的最大值

[[email protected] ~]# grep -vE‘^$|^#‘ /etc/security/limits.conf

*      hard         nofile       10240

*      soft         nofile      10240

[[email protected] ~]#

// soft<=hard soft的限制不能比hard限制高

2、修改系统限制

[[email protected] ~]# sysctl -wfs.file-max=400000

fs.file-max = 400000

[[email protected] ~]# echo350000 > /proc/sys/fs/file-max  //重启后失效

[[email protected] ~]# cat /proc/sys/fs/file-max

350000

[[email protected] ~]#

//以上是临时修改文件描述符

//永久修改把fs.file-max=400000添加到/etc/sysctl.conf中,使用sysctl -p即可


下面是摘自kernel document中关于file-max和file-nr参数的说明

file-max & file-nr:

The kernel allocates file handles dynamically, but as yet it doesn‘t free them again.

内核可以动态的分配文件句柄,但到目前为止是不会释放它们的

The value in file-max denotes the maximum number of file handles that the Linux kernel will allocate. When you get lots of error messages about running out of file handles, you might want to increase this limit.

file-max的值是linux内核可以分配的最大文件句柄数。如果你看到了很多关于打开文件数已经达到了最大值的错误信息,你可以试着增加该值的限制

Historically, the three values in file-nr denoted the number of allocated file handles, the number of allocated but unused file handles, and the maximum number of file handles. Linux 2.6 always reports 0 as the number of free file handles -- this is not an error, it just means that the number of allocated file handles exactly matches the number of used file handles.

在kernel 2.6之前的版本中,file-nr 中的值由三部分组成,分别为:1.已经分配的文件句柄数,2.已经分配单没有使用的文件句柄数,3.最大文件句柄数。但在kernel 2.6版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件句柄无一浪费的都已经被使用了

参考文档:维基百科 http://salogs.com/

时间: 2024-08-29 01:27:43

Linux下文件描述符的相关文章

Linux中文件描述符和打开文件之间的关系

Linux中文件描述符和打开文件之间的关系 文件描述符: 在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表. Linux中的文件类型 Linux系统中把一切都看做文件,包括普通文件-.目录文件d.字符设备文件c.块设备文件b.符号链接文件l.文件描述符是内核为了高效管理已被打开的文件所创建的索引(一个非负整数),用于指代已被打开的文件,Linux下所有的的I/O操作的系统调用都是通过文件描述符执行.例如0表示标准输入.1表示标准输出.3表示标准错

C语言下的FILE指针与Linux的文件描述符

FILE*:它是C库中定义的一个结构体指针,我们在C语言文件操作时打开一个文件返回的指针类型就是它,在C库中是这样定义的,其中的_file它是一个整数,就是作为文件索引的描述符,C库是建立在系统调用上的,这个FILE结构体可以说是一个包装,底层还是用文件描述符对磁盘上的文件进行连接的. 文件描述符:在linux系统中每打开一个文件就会获取一个文件描述符,他是一个小整数,在linux下0号1号2号文件操作符分别是标准输入,标准输出,标准错误. 每个进程在运行时都会有个PCB,而PCB中都会有一张文

Linux中文件描述符fd和文件指针flip的理解

转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp. open:文件描述符的操作(如: open)返回的是一个文件描述符(int fd),内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件都将通过此表中的文件描述符来引用(fd1,fd2,fd3...); fopen:而流(如: f

linux 最大文件描述符fd

使用四种框架分别实现百万websocket常连接的服务器 著名的 C10K 问题提出的时候, 正是 2001 年.这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务这个问题,当时因为硬件和软件的**,单机1万还是一个非常值得挑战的目标.但是时光荏苒,随着硬件和软件的飞速发展,单机1万的目标已经变成了最简单不过的事情.现在用任何一种主流语言都能提供单机1万的并发处理的能力.所以现在目标早已提高了100倍,变成C1000k,也就是一台服务器为100万连接提供服务.

【Linux】文件描述符与重定向

重定向符号 符号 描述 > 输出重定向到一个文件或设备 覆盖原来的文件 >! 输出重定向到一个文件或设备 强制覆盖原来的文件 >> 输出重定向到一个文件或设备 追加原来的文件 < 输入重定向到一个程序 标准错误重定向符号 符号 描述 2> 将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件 2>> 将一个标准错误输出重定向到一个文件或设备 追加到原来的文件 2>&1 将一个标准错误输出重定向到标准输出 注释:1 标准输出 >&

ArchLinux 下文件描述符

stderr -> /proc/self/fd/2 标准错误:2 stdin -> /proc/self/fd/0 标准输入:0 stdout -> /proc/self/fd/1 标准输出:1 只读模式"<":<command> "<"  <file>(注意command必须在前) 截断写入">":<command>  ">" <file&g

Linux 文件描述符问题

昨天解了个bug,关于文件描述符的,这种问题很久之前也遇到过,这次再犯真的不该. 问题是这样的. fopen()打开一个文件,然后做了一些操作,然后函数执行结束...没有调用fclose()导致了,再执行此函数时,系统提示,文件描述符分配完毕. 分析了下: 根据以前的知识储备, 1.linux打开文件描述符的最大个数为1024,根据这次发现, 2.这是针对于单独进程的, 3.是从/proc/{pid}/fd/这个文件夹下可以看到. 4.分配文件描述符是递增的顺序.(看我之前的博客会发现这是那个b

[转帖]linux文件描述符文件/etc/security/limits.conf

linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习了解一下. 文件描述符是什么?和文件句柄有啥区别? 文件描述符是linux/unix操作系统中特有的概念.相当于windows系统中的文件句柄.一个意思不同叫法. Linux系统中, 每当进程打开一个文件时,系统就为其分配一个唯一的整型文件描述符,用来标识这个文件.标准C中每个进程默认打开的有三个文

Linux 文件描述符

////////////////////////////////////////////////////////////////////////////////////////////////////// 1.UNIX文件描述符 Unix操作系统或者Linux操作系统的文件描述符使用一个非负整数来表示,但是文件描述符不仅仅是一个非负数,Unix对于文件IO有以下几个数据结构: A.       每个进程都有一个进程表,其中有个记录表项,这个记录表项指向的是一个打开文件描述符表,这个文件描述符表是