Linux编程--文件描述符fd,Linux命令ulimit
linux中, 每一个进程在内核中,都对应有一个“打开文件”数组,存放指向文件对象的指针,而 fd 是这个数组的下标。
我们对文件进行操作时,系统调用,将fd传入内核,内核通过fd找到文件,对文件进行操作。
既然是数组下标,fd的类型为int, < 0 为非法值, >=0 为合法值。在linux中,一个进程默认可以打开的文件数为1024个,fd的范围为0~1023。可以通过设置,改变最大值。
在linux中,值为0、1、2的fd,分别代表标准输入、标准输出、标准错误输出。在上一篇文章中,使用重定向 2>/dev/null 就是把标准错误输出重定向到位桶中去,不显示出来。因为 0 1 2已经被linux使用了,通常在程序中打开的fd,是从3开始的。但我们在判断一个fd是否合法时,依然要使用>=0的判断标准。
fd的分配原则,是从小到大,找到第一个不用的进行分配。
除了open之外, socket编程的socket()/accept()等函数,也会返回一个fd值。
1)Linux系统下,所有进程允许打开的最大fd数量。查询语句:
/proc/sys/fs/file-max
2)Linux系统下,所有进程已经打开的fd数量及允许的最大数量。查询语句:
/proc/sys/fs/file-nr
3)单个进程允许打开的最大fd数量.查询语句:
ulimit -n
4)单个进程(例如进程id为5454)已经打开的fd.查询语句:
ls -l /proc/5454/fd/
Linux命令ulimit
ulimit命令简介
通过命令查询官方的简要解释如下:man ulimit
ulimit [-HSTabcdefilmnpqrstuvx [limit]]
在允许 shell 和由它启动的进程的系统上提供对可用资源的控制。-H 和 -S 选项指定为给定资源设置硬限制或软限制。硬限制一旦设置,非root用户就无法增加;软限制可以增加到硬限制的值。如果未指定 -H 和 -S,则同时设置软限制和硬限制。limit 的值可以是为资源指定的单位中的数字,也可以是特殊值"硬"、"软"或"无限"之一,它们分别代表当前硬限制、当前软限制和无限制。如果省略限制,则打印资源软限制的当前值,除非给出了 -H 选项。指定多个资源时,限制名称和单位将打印在值之前。其他选项的解释如下:
-a:报告所有电流限制-b:最大套接字缓冲区大小-c:创建的核心文件的最大大小-d:进程数据段的最大大小-e:最大调度优先级("nice")-f:shell 及其子级写入的文件的最大大小-i:挂起信号的最大数量-l:可能锁定到内存中的最大大小-m:最大驻留集大小(许多系统不遵守此限制)-n:打开的文件描述符的最大数量(大多数系统不允许设置此值)-p:以 512 字节块为单位的管道大小(可能未设置)-q:POSIX 消息队列中的最大字节数-r:最大实时调度优先级-s:最大堆栈大小-t:最大 CPU 时间量(以秒为单位)-u:单个用户可使用的最大进程数-v:可用于 shell 的最大虚拟内存量-x:文件锁定的最大数量-T:最大线程数
如果给出了限制,则它是指定资源的新值(仅显示 -a 选项)。如果未给出任何选项,则假定为 -f。值以 1024 字节为增量,但 -t(以秒为单位)、-p(以 512 字节块为单位)和 -T、-b、-n 和 -u(未缩放)除外。返回状态为 0,除非提供了无效的选项或参数,或者在设置新限制时发生错误。
简要说明如下:
- 进行资源控制的对象?当前的shell以及其下启动的process;
- 什么时候生效?设置之后,当前shell就生效了,重启即失效;
ulimit -n 1024
通过命令,即可查看当前shell及其下启动的process所允许占用资源的上限,例如:ulimit -a
[dev@cib69 elasticsearch-1.4.4]$ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 514940max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 2048pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 10240cpu time (seconds, -t) unlimitedmax user processes (-u) 1024virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited
limits.conf文件
上述使用方式设置的参数,只对当前shell生效,重启之后失效,有没有永久生效的配置?有,文件。文件的样例如下:ulimit -n 1024/etc/security/limits.conf
# /etc/security/limits.conf##Each line describes a limit for a user in the form:##<domain> <type> <item> <value>##Where:#<domain> can be:# - an user name# - a group name, with @group syntax# - the wildcard *, for default entry# - the wildcard %, can be also used with %group syntax,# for maxlogin limit##<type> can have the two values:# - "soft" for enforcing the soft limits# - "hard" for enforcing hard limits##<item> can be one of the following:# - core - limits the core file size (KB)# - data - max data size (KB)# - fsize - maximum filesize (KB)# - memlock - max locked-in-memory address space (KB)# - nofile - max number of open files# - rss - max resident set size (KB)# - stack - max stack size (KB)# - cpu - max CPU time (MIN)# - nproc - max number of processes# - as - address space limit (KB)# - maxlogins - max number of logins for this user# - maxsyslogins - max number of logins on the system# - priority - the priority to run user process with# - locks - max number of file locks the user can hold# - sigpending - max number of pending signals# - msgqueue - max memory used by POSIX message queues (bytes)# - nice - max nice priority allowed to raise to values: [-20, 19]# - rtprio - max realtime priority##<domain> <type> <item> <value>##* soft core 0#* hard rss 10000#@student hard nproc 20#@faculty soft nproc 20#@faculty hard nproc 50#ftp hard nproc 0#@student - maxlogins 4# End of file
举例,设置用户允许用户dev同时打开文件个数为64000,则,在文件中添加如下配置即可:/etc/security/limits.conf
dev soft nofile 64000dev hard nofile 64000
参考来源
- 修改linux最大打开文件数ulimit
- Linux下
man ulimit - 通过 ulimit 改善系统性能

浙公网安备 33010602011771号