[size=medium]
运行在Linux系统上的Java程序可能会出现"Too many open files"的异常情况,且常见于高并发访问文件系统,多线程网络连接等场景。
程序经常访问的文件、socket在Linux中都是文件file,系统需要记录每个当前访问file的name、location、access authority等相关信息,这样的一个实体被称为file entry。“open files table”(图中橙色标识)存储这些file entry,以数组的形式线性管理。文件描述符(file descriptor)作为进程到open files table的指针,也就是open files table的下标索引,将每个进程与它所访问的文件关联起来了。[/size]
[img]http://dl.iteye.com/upload/attachment/308682/63ab42fe-e3f8-34c6-a337-1d0ddf7ec840.jpg[/img]
[size=medium]每个进程中都有一个file descriptor table管理当前进程所访问([i]open[/i] or [i]create[/i])的所有文件,文件描述符关联着open files table中文件的file entry。细节不表,对于open files table能容纳多少file entry。Linux系统配置open files table的文件限制,如果超过配置值,就会拒绝其它文件操作的请求,并抛出Too many open files异常。这种限制有系统级和用户级之分。[/size]
[size=medium] [b]系统级:[/b][/size]
[size=medium]系统级设置对所有用户有效。可通过两种方式查看系统最大文件限制
1 [i]cat /proc/sys/fs/file-max[/i]
2 [i]sysctl -a[/i] 查看结果中fs.file-max这项的配置数量
如果需要增加配置数量就修改/etc/sysctl.conf文件,配置fs.file-max属性,如果属性不存在就添加。
[color=blue]配置完成后使用[i]sysctl -p[/i]来通知系统启用这项配置[/color][/size]
[size=medium] [b]用户级:[/b][/size]
[size=medium]Linux限制每个登录用户的可连接文件数。可通过 [i]ulimit -n[/i]来查看当前有效设置。如果想修改这个值就使用 [i]ulimit -n <setting number>[/i] 命令。[/size]
[color=blue] 对于文件描述符增加的比例,资料推荐是以2的幂次为参考。如当前文件描述符数量是1024,可增加到2048,如果不够,可设置到4096,依此类推。[/color]
[size=medium] 在出现Too many open files问题后,首先得找出主要原因。最大的可能是打开的文件或是socket没有正常关闭。为了定位问题是否由Java进程引起,通过Java进程号查看当前进程占用文件描述符情况:[/size]
[size=medium]分析命令的结果,可判断问题是否由非正常释放资源所引起。[/size]
[size=medium]文件描述符资料 : [url=http://www.cim.mcgill.ca/~franco/OpSys-304-427/lecture-notes/node27.html]简介[/url] [url=www.comp.nus.edu.sg/~bilgehan/cs2106/dup.pdf]PDF下载[/url][/size]
运行在Linux系统上的Java程序可能会出现"Too many open files"的异常情况,且常见于高并发访问文件系统,多线程网络连接等场景。
程序经常访问的文件、socket在Linux中都是文件file,系统需要记录每个当前访问file的name、location、access authority等相关信息,这样的一个实体被称为file entry。“open files table”(图中橙色标识)存储这些file entry,以数组的形式线性管理。文件描述符(file descriptor)作为进程到open files table的指针,也就是open files table的下标索引,将每个进程与它所访问的文件关联起来了。[/size]
[img]http://dl.iteye.com/upload/attachment/308682/63ab42fe-e3f8-34c6-a337-1d0ddf7ec840.jpg[/img]
[size=medium]每个进程中都有一个file descriptor table管理当前进程所访问([i]open[/i] or [i]create[/i])的所有文件,文件描述符关联着open files table中文件的file entry。细节不表,对于open files table能容纳多少file entry。Linux系统配置open files table的文件限制,如果超过配置值,就会拒绝其它文件操作的请求,并抛出Too many open files异常。这种限制有系统级和用户级之分。[/size]
[size=medium] [b]系统级:[/b][/size]
[size=medium]系统级设置对所有用户有效。可通过两种方式查看系统最大文件限制
1 [i]cat /proc/sys/fs/file-max[/i]
2 [i]sysctl -a[/i] 查看结果中fs.file-max这项的配置数量
如果需要增加配置数量就修改/etc/sysctl.conf文件,配置fs.file-max属性,如果属性不存在就添加。
[color=blue]配置完成后使用[i]sysctl -p[/i]来通知系统启用这项配置[/color][/size]
[size=medium] [b]用户级:[/b][/size]
[size=medium]Linux限制每个登录用户的可连接文件数。可通过 [i]ulimit -n[/i]来查看当前有效设置。如果想修改这个值就使用 [i]ulimit -n <setting number>[/i] 命令。[/size]
[color=blue] 对于文件描述符增加的比例,资料推荐是以2的幂次为参考。如当前文件描述符数量是1024,可增加到2048,如果不够,可设置到4096,依此类推。[/color]
[size=medium] 在出现Too many open files问题后,首先得找出主要原因。最大的可能是打开的文件或是socket没有正常关闭。为了定位问题是否由Java进程引起,通过Java进程号查看当前进程占用文件描述符情况:[/size]
lsof -p $java_pid 每个文件描述符的具体属性
lsof -p $java_pid | wc -l 当前Java进程file descriptor table中FD的总量
[size=medium]分析命令的结果,可判断问题是否由非正常释放资源所引起。[/size]
[size=medium]文件描述符资料 : [url=http://www.cim.mcgill.ca/~franco/OpSys-304-427/lecture-notes/node27.html]简介[/url] [url=www.comp.nus.edu.sg/~bilgehan/cs2106/dup.pdf]PDF下载[/url][/size]