Linux下文件描述符

标签: linux file linux内核 apache unix socket
11789人阅读 评论(0) 收藏 举报
分类:

文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和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文件描述符的三种方式:

[root@localhost ~]# sysctl -a | grep -i file-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

*                hard nofile                  4096

[root@localhost ~]#

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

[root@localhost ~]# grep -vE'^$|^#' /etc/security/limits.conf

*      hard         nofile       10240

*      soft         nofile      10240

[root@localhost ~]#

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

 

2、修改系统限制

[root@localhost ~]# sysctl -wfs.file-max=400000

fs.file-max = 400000

[root@localhost ~]# echo350000 > /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参数的说明

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/

查看评论

Linux系统文件描述符理解

1、查看系统文件描述符个数。以下是查看Linux文件描述符的三种方式:[root@localhost ~]# sysctl -a | grep -i file-max --colorfs.file-m...
  • u010889616
  • u010889616
  • 2015-08-31 11:01:08
  • 1550

文件句柄(file handles) & 文件描述符(file descriptors)

1.概述 在实际工作中会经常遇到一些bug,有些就需要用到文件句柄,文件描述符等概念,比如报错: too many open files, 如果你对相关知识一无所知,那么debug起来将会异常痛苦。...
  • u013256816
  • u013256816
  • 2017-03-07 20:23:58
  • 4515

Linux查看进程打开多少文件描述符命令-lsof

转自:http://blog.csdn.net/zlzlei/article/details/7730253 lsof简介 lsof(list open files)是...
  • csCrazybing
  • csCrazybing
  • 2017-04-27 11:36:04
  • 1491

从文件描述符来获取文件名

因为项目中一个小需求要从一个文件描述符中获取出文件描述符所指向的文件名本来可以在接口中把文件描述符和文件名一起封装成一个结构来返回但因为在别的地方也会这种应用,所以就想单独把从文件描述符获取文件名做成...
  • szkarry
  • szkarry
  • 2008-06-13 16:25:00
  • 2473

修改Linux最大进程数、最大文件数

我们可以通过ulimit -a来查看当前Linux系统的一些系统参数。 $ ulimit -a core file size (blocks, -c) 0 data seg siz...
  • teddy6866
  • teddy6866
  • 2018-02-06 11:19:24
  • 51

设置Linux最大打开文件数和进程数

一、设置linux系统最大打开文件数和单个进程最大打开文件数 1.    系统最大打开文件描述符数:/proc/sys/fs/file-max a.    查看 $ cat /proc/sys/fs/...
  • zpcandzhj
  • zpcandzhj
  • 2015-08-24 16:20:57
  • 2189

linux 系统资源配置(ulimit)

1,说明: ulimit用于shell启动进程所占用的资源. 2,类别: shell内建命令 3,语法格式: ulimit [-acdfHlmnpsStvw] [size] 4,参数介绍:...
  • lbqBraveheart
  • lbqBraveheart
  • 2011-11-18 18:03:22
  • 2283

ulimit详解

通过ulimit -n命令可以查看linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值。那么应该在...
  • qq_32907349
  • qq_32907349
  • 2016-11-04 16:07:22
  • 620

centos 7修改打开文件数限制

本文转自:http://www.tuicool.com/articles/b2UNzm,未作修改。由于原文内容过多,在此仅列出部分内容。 3、加大打开文件数的限制(open files) 查...
  • daxiang12092205
  • daxiang12092205
  • 2016-08-03 08:57:11
  • 9716

设置ulimit值(Linux文件句柄数量)永久生效

设置ulimit值(Linux文件句柄数量)永久生效inux 默认打开文件数linux 默认打开文件数为1024个,通过ulimit -a 可以查看open files修改这个限制可以使用ulimt ...
  • hishe
  • hishe
  • 2010-12-15 22:10:00
  • 13313
    个人资料
    等级:
    访问量: 38万+
    积分: 4798
    排名: 7508