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 -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 514940
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file 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 64000
dev hard nofile 64000
参考来源
- 修改linux最大打开文件数ulimit
- Linux下
man ulimit
- 通过 ulimit 改善系统性能