问题
每次web服务器或者是几乎所有Linux服务器都需要对文件描述符进行调整,我使用ulimit -n
来查看当前用户的最多能打开的文件,默认设置的是1024个,但是系统运行起来以及开启一些简单的服务使用lsof | wc -l
查看到系统已经打开几万个文件了,疑问来了,文件描述符的限制为什么没有生效?
解决
我查看的是系统的全部打开的文件,而使用ulimit -n
查看到的是当前用户的文件描述符的限制
系统的文件描述符限制使用cat /proc/sys/fs/file-max
命令查看
了解Linux系统的文件描述符的限制
linux系统中通常会对每个进程所能打开的文件数据有一个限制,当进程中已打开的文件描述符超过这个限制时,open()等获取文件描述符的系统调用都会返回失败。
- linux下最大文件描述符的限制有两个方面,一个是用户级的限制,另外一个则是系统级限制。
用户级限制:ulimit命令看到的是用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制,那么像我们的web服务器,如果是使用降权用户进行启动的话,也要对该用户进行文件描述符的调整
系统级限制:sysctl命令和proc文件系统中查看到的数值是一样的,这属于系统级限制,它是限制所有用户打开文件描述符的总和
修改限制数量
- 用户级
[root@localhost ~]# ulimit -n 10000
#临时修改,只对当前shell有效
-a:显示目前资源限制的设定;
-c <core文件上限>:设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制;
-t <CPU时间>:指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。
vi /etc/security/limits.conf
* hard nofile 65536
* soft nofile 65536
#永久修改
- 修改系统级限制
通过sysctl命令修改/etc/sysctl.conf文件:sysctl -w fs.file-max=2048
,完成后执行sysctl -p
即可
报错记录
[root@localhost ~]# dd if=/dev/zero of=./cc.txt bs=100M count=21
文件大小超出限制(吐核)
刚开始挺懵的,后来查阅资料了解了下
原因:人为操作失误,我使用ulimit 10000
命令,结果是缺省会有-f
选项,意思就是我设置这条命令之后再创建的单个文件最大不能超过10000个块的大小也就是40000K=40M。
解决:调整-f后的数量