linux 文件描述符个数配置

2016-04-15 10:28:00 boshuzhang 阅读数 4261

linux下文件描述符的介绍

 (2012-10-02 16:01:56)
标签: 

描述符

 

调用

 

返回

 

进程

 

限制

 

it

分类: linux
当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符。所谓的文件描述符是一个低级的正整数。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应。因此,函数 scanf() 使用 stdin,而函数 printf() 使用 stdout。你可以用不同的文件描述符改写默认的设置并重定向进程的 I/O 到不同的文件。

1、首先说什么是文件描述符,它有什么作用?
文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix 操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix 通常有一个系统级的限制。
因为squid 的工作方式,文件描述符的限制可能会极大的影响性能。当squid 用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。直到一部分当前请求完成,相应的文件和socket 被关闭,squid 不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。
在运行./configure 之前,检查你的系统的文件描述符限制是否合适,能给你避免一些麻烦。大多数情况下,1024 个文件描述符足够了。非常忙的cache可能需要4096或更多。在配置文件描述符限制时,我推荐设置系统级限制的数量为每个进程限制的2 倍。
2、怎么突破,具体方法?
先查看LINUX默认的文件描述符:
# ulimit -n
1024
我们用命令
ulimit -HSn 65536
来增大文件描述符,然后编译安装squid,
把ulimit -HSn 65536放到/etc/rc.d/rc.local让启动时加载。
以下为转载:
Linux
在Linux 上配置文件描述符有点复杂。在编译squid 之前,你必须编辑系统include 文件中的一个,然后执行一些shell 命令。请首先编辑/usr/include/bits/types.h 文件,改变__FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192
下一步,使用这个命令增加内核文件描述符的限制:
# echo 8192 >; /proc/sys/fs/file-max
最后,增加进程文件描述符的限制,在你即将编译squid 的同一个shell 里执行:
sh# ulimit -Hn 8192
该命令必须以root 运行,仅仅运行在bash shell。不必重启机器。
使用这个技术,你必须在每一次系统启动后执行上述echo 和ulimit 命令,或者至少在squid 启动之前。假如你使用某个rc.d 脚本来启动squid,那是一个放置这些命令的好地方。
补充: 
  
文件描述符
是个很小的正整数,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。 
  文件描述符的优点:兼容POSIX标准,许多
Linux

UNIX
系统调用都依赖于它。
  文件描述符的缺点:不能移植到UNIX以外的系统上去,也不直观。
    基于文件描述符的输入输出函数:
  open:打开一个文件,并指定访问该文件的方式,调用成功后返回一个文件描述符。
  creat:打开一个文件,如果该文件不存在,则创建它,调用成功后返回一个文件描述符。
  close:关闭文件,进程对文件所加的锁全都被释放。
  read:从文件描述符对应的文件中读取数据,调用成功后返回读出的字节数。
  write:向文件描述符对应的文件中写入数据,调用成功后返回写入的字节数。
  ftruncate:把文件描述符对应的文件缩短到指定的长度,调用成功后返回0。
  lseek:在文件描述符对应的文件里把文件指针设定到指定的位置,调用成功后返回新指针的位置。
  fsync:将所有已写入文件中的数据真正写到磁盘或其他下层设备上,调用成功后返回0。
  fstat:返回文件描述符对应的文件的相关信息,把结果保存在struct stat中,调用成功后返回0。
  fchown:改变与打开文件相关联的所有者和所有组,调用成功后返回0。
  fchmod:把文件描述符对应的文件的权限位改为指定的八进制模式,调用成功后返回0。
  flock:用于向文件描述符对应的文件施加建议性锁,调用成功后返回0。
  fcntl:既能施加建议性锁也能施加强制性锁,能建立记录锁、读取锁和写入锁,调用成功后返回0。
  dup:复制文件描述符,返回没使用的文件描述符中最小的编号。
  dup2:由用户指定返回的文件描述符的值,用来重新打开或重定向一个文件描述符。
  select:同时从多个文件描述符读取数据或向多个文件描述符写入数据
2017-01-05 10:31:10 zero__007 阅读数 5030
转载自:http://blog.csdn.net/wsscy2004/article/details/41895263

       在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息。
       在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开的文件描述符数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:
ulimit -n
       一般每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。
       对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件描述符的数量限制。修改上述限制的最简单的办法就是使用ulimit命令:
ulimit –n 65535
       上述命令中设置了的单一进程允许打开的最大文件数,但只是临时的,永久生效的方法需要修改/etc/security/limits.conf,在最后添加:
* soft nofile 605536
* hard nofile 605536
2019-01-20 19:52:16 genzld 阅读数 1508

一:系统

   1.系统最大打开文件描述符数: /proc/sys/fs/file-max

   2.查看:

                $ cat /proc/sys/fs/file-max

   3.重新设置:

        ①临时性: $ echo 1000000 > /pro/sys/fs/file-max

         ②永久性:在配置文件/etc/sysctl.conf中设置

                             fs.file-max = 1000000

二:进程

  1.进程最多打开文件描述符数:user limit中的nofile的soft limit

   2.查看:$ ulimit -n

   3.设置:

           ①临时性:通过ulimit -Sn设置最大打开文件描述符的soft limit,注意soft limit 不能大于 hard limit(ulimit -Hn可查看hard                                    limit),另外ulimit-n默认查看的是soft limit,但是ulimit -n 180000则是同时设置foft limit和hard limit。对于非root                                用户只能设置比原来小的hard limit。

               A:查看hard limit:$ ulimit -Hn

               B:设置soft limit,必须小于hard limit:

                           $ ulimit -Sn 160000

            ②永久性:上面的方法只是临时性的,注销重新登录就失效了,而且不能增大hard limit,只能在hard limit范围内修改soft                               limit,若要永久修改,则需要在/etc/security/limits.conf中进行设置(root用户),可添加如下两行,表示所有                                 用户最大打开文件描述符数的soft limit为102400,hard limit为1040800.一下设置需要注销之后重新登录才能                                 生效:

                                 在etc/security/limits.conf中添加如下内容:

                                    *soft nofile 102400

                                    *hard nofile 104800

             注意:设置nofile的hard limit还要注意一点的就是hard limit不能大于/proc/sys/fs/nr_open,加入hard大于nr_open,注销                           后将无法正常登陆。

             可以修改nr_open的值:# echo 200000 > /pro/sys/fs/nr_open

三:查看当前系统使用的打开文件符数

   $ cat /proc/sys/fs/file-nr

   5664   0   186405

   其中第一个数表示当前系统已分配使用的打开文件描述符数,第二个数为分配后已释放的(目前已不再使用),第三个数等于    file-max 

四:总结

  》1.所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max

  》2.单个进程打开的文件描述符数不能超过user limit中的nofile的soft limit

  》3.nofile的soft limit不能超过其hard limit

  》4.nofile的hard limt 不能超过 /proc/sys/fs/nr_open.

 

 

 

 

 

2017-03-06 23:15:38 Artprog 阅读数 2434

可参考《Linux程序设计 第四版》


什么是文件描述符(file descriptor)

每个进程(运行中的程序)都有与之关联的文件描述符. 文件描述符通常是一些小的整数,我们可以通过一个进程的文件描述符访问该进程打开的文件或这设备. 一个进程能够有多少文件描述符取决于系统的配置. 当一个程序开始运行时, 它一般有三个文件描述符:

文件描述符 含义
0 标准输入 (standard input)
1 标准输出 (standard output)
2 标准错误 (standard error)


文件描述符(file descriptor)这个概念可能对初次接触Linux编程的人来说,是一个比较新的概念。拿人来举例子,我们有眼睛、耳朵、皮肤等输入设备;有嘴巴、四肢等输出设备;有时候人生病了,会有一些症状,我们也可以理解其为错误输出。

在类Unix操作系统中,每个进程也有这三种类似的东西,分别是上表中的标准输入、标准输出以及标准错误。更进一步,为了方便操作系统对进程进行管理,我们给每个文件描述符都编了号,0、1、2就分别是标准输入、标准输出以及标准错误的编号。


write系统调用

简单地说,write系统调用就是一个函数,它可以将缓冲区 buf 的前 nbytes 个字节写入与文件描述符相关联的文件中,它返回实际写入的字节数。其原型如下:

#include <unistd.h>

size_t write(int fildes, const void *buf, size_t nbytes);

下面的程序,可以对这个命令行程序本生进行写操作:

#include <unistd.h>
#include <stdio.h>

int main()
{
    if(write(1, "Here is some data\n", 18) != 18)
        write(2, "A write error has occurred on file descriptor 1\n", 46);
    return 0;
}

上面这段程序很简单,我们运行它的时候,它就是当前的进程,该程序的 if 语句将字符串 “Here is some data\n” 写入了自己的1号文件描述符,也就是标准输出。

因为它是命令行程序,所以标准输入是命令行的输入流,标准输出是命令行的输出流,所以当运行这个程序的时候,命令行会显示一个字符串 “Here is some data\n”。

下面是编译以及运行的结果:

$ gcc -o simple_write simple_write.c # compile
$ ./simple_write                     # run
Here is some data                    # standard output  
$ 

所以,文件描述符无非就是一些与当前进程相关的文件的数值表示(就好像一个班级里每个学生都有学号一样,能够方便地管理学生),我们可以方便地使用文件描述符进行各种操作。

2017-11-19 20:57:29 zwmnhao1980 阅读数 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 -w fs.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,这并不是一个错误,它实际上意味着已经分配的文件句柄无一浪费的都已经被使用了

Linux下文件描述符

阅读数 14233