最近项目中碰到一个bug, 出现errno 24的错误,貌似打开的文件过多。
查找出错的代码,发现有文件打开后没有关闭, 为了找出根源,研究了一下linux debug打开文件过多的方法,主要用到两个命令。
一、ulimit命令
1,说明:
ulimit用于shell启动进程所占用的资源.
2,类别:
shell内建命令
3,语法格式:
ulimit [-acdfHlmnpsStvw] [size]
4,参数介绍:
-H 设置硬件资源限制.
-S 设置软件资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes
我们可以用ulimit -a来查看所有限制值,我只关心文件句柄数量的问题
open files (-n) 1024
这个就是限制数量
这里,有很多ulimit的文章都说的很含糊,究竟这个1024是系统的限制,还是用户的限制呢。其实,这个是用户限制来的,完整的说法,应该是当前用户准备要运行的程序的限制。
1、这个限制是针对单个程序的限制
2、这个限制不会改变之前已经运行了的程序的限制
3、对这个值的修改,退出了当前的shell就会消失
比如说,我先运行了一个程序a,然后通过ulimit修改了限制为2048,然后运行b,然后退出了shell再登录,然后运行c.那就只有b可以打开2048个句柄。
ulimit其实就是对单一程序的限制,那系统总限制呢?
其实是在这里,/proc/sys/fs/file-max, 可以通过cat查看目前的值,echo来立刻修改
另外还有一个,/proc/sys/fs/file-nr,该文件与 file-max 相关,它有三个值:
已分配文件句柄的数目,已使用文件句柄的数目,文件句柄的最大数目,该文件是只读
的,仅用于显示信息, 我就是查看这个文件证实了的确是打开的文件数超过了最大
数才出现bug.
二、lsof
查看所有进程的文件打开数
lsof |wc -l
查看某个进程打开的文件数
lsof -p pid |wc -l
查看某个文件被打开的次数
lsof |grep 文件名|wc -l (我用这个命令证实了代码中没有被close的文件一直在增加)