Linux 下应用程序最大打开文件数的理解和修改

   运行在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的下标索引,将每个进程与它所访问的文件关联起来了。


  每个进程中都有一个file descriptor table管理当前进程所访问(open or create)的所有文件,文件描述符关联着open files table中文件的file entry。细节不表,对于open files table能容纳多少file entry。Linux系统配置open files table的文件限制,如果超过配置值,就会拒绝其它文件操作的请求,并抛出Too many open files异常。这种限制有系统级和用户级之分。

  系统级:

  系统级设置对所有用户有效。可通过两种方式查看系统最大文件限制

  1 cat /proc/sys/fs/file-max

  2 sysctl -a 查看结果中fs.file-max这项的配置数量

  如果需要增加配置数量就修改/etc/sysctl.conf文件,配置fs.file-max属性,如果属性不存在就添加。

  配置完成后使用sysctl -p来通知系统启用这项配置

  用户级:

  Linux限制每个登录用户的可连接文件数。可通过 ulimit -n来查看当前有效设置。如果想修改这个值就使用 ulimit -n 命令。

  对于文件描述符增加的比例,资料推荐是以2的幂次为参考。如当前文件描述符数量是1024,可增加到2048,如果不够,可设置到4096,依此类推。

  在出现Too many open files问题后,首先得找出主要原因。最大的可能是打开的文件或是socket没有正常关闭。为了定位问题是否由Java进程引起,通过Java进程号查看当前进程占用文件描述符情况:

  lsof -p $java_pid 每个文件描述符的具体属性

  lsof -p $java_pid | wc -l 当前Java进程file descriptor table中FD的总量

  分析命令的结果,可判断问题是否由非正常释放资源所引起。

  如果我们只是普通用户,只是暂时的修改ulimit -n,可以直接shell命令来修改(ulimit -n 1024000)。但是这个设置时暂时的保留!当我们退出bash后,该值恢复原值。

  如果要永久修改ulimit,需要修改/etc/security/limits.conf。

  vim /etc/security/limits.conf

  # 添加如下的行

  * soft nofile 2048

  * hard nofile 2048

  以下是说明:

  * 代表针对所有用户

  noproc 是代表最大进程数

  nofile 是代表最大文件打开数

  添加格式:

  [username | @groupname] type resource limit

  [username | @groupname]:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。

  type:有 soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比hard 限制高。用 - 就表明同时设置了 soft 和 hard 的值。

  resource:

  core - 限制内核文件的大小(kb)

  date - 最大数据大小(kb)

  fsize - 最大文件大小(kb)

  memlock - 最大锁定内存地址空间(kb)

  nofile - 打开文件的最大数目

  rss - 最大持久设置大小(kb)

  stack - 最大栈大小(kb)

  cpu - 以分钟为单位的最多 CPU 时间

  noproc - 进程的最大数目

  as - 地址空间限制

  maxlogins - 此用户允许登录的最大数目

  实例:

  username soft nofile 2048

  username hard nofile 2048

  @groupname soft nofile 2048

  @groupname hard nofile 2048

时间: 2024-10-28 01:58:55

Linux 下应用程序最大打开文件数的理解和修改的相关文章

多线程-linux 下c 程序,开了1024个线程 依次等待共同完成某个任务,程序异常退出,不出core

问题描述 linux 下c 程序,开了1024个线程 依次等待共同完成某个任务,程序异常退出,不出core 程序简单来说类似一个多线程下载器,开了1024个线程,然后并发去服务器读取一个大文件的某一块,读取完成后,文件合并要按照顺序写文件,所以我采用了pthread_join依次等待上一个线程写完成操作.测试时候发现程序偶尔会突然down掉,也不出core,并不是总down,也会有成功执行时候.机器配制足够高了,内存96G,24核cpu...希望大家帮忙分析下..谢谢,代码逻辑如下. void*

急急急解决掉割了-linux下fortran程序调试

问题描述 linux下fortran程序调试 如何在linux下进行fortran程序的调试?如何设置短点?如何读取参数? 解决方案 http://emuch.net/html/201111/3842995.html 解决方案二: linux程序调试Linux程序调试Linux程序调试

linux下某程序中实现对进程的实时流量监控功能

问题描述 linux下某程序中实现对进程的实时流量监控功能 求大牛赐教 现在开发了一个程序,在linux下跑,想在里面加一个对特定进程的网络流量监控,实时统计进程流量大小 现在想到的办法就是用libpcap库,对应/proc里面文件按照pid 端口号 数据包 数据大小 进行统计得出当前流量大小. 目前有如下问题: 1.程序中已有功能中已经使用了libpcap去抓去一段数据包然后输出libpcap文件,如果按照上述办法,会不会造成再用libpcap采集数据包出问题?或者说libpcap可不可以多次

Linux下c++程序内存泄漏检测代码范例

Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrind工具.但是valgrind相当于让程序在虚拟机中运行,会带 来较大的系统资源开销,还会对程序的运行效率产生较大影响,对于那种资源占用大的程序,如果需要长时间运行才能暴露的泄漏问题,它就显得不太好用. linux下的c++程序中自己实现一个轻量级的泄漏检测代码其实是比较方便的,下面我就给出一个简单的范例,并作简单的说明.当然,我们还是应该提倡使用共享指针,用共享指针自动管理内存可以避免内存泄漏这样的不必要的麻烦. 基本

LINUX下PHP程序实现WORD文件转化为PDF文件的方法_php技巧

本文实例讲述了LINUX下PHP程序实现WORD文件转化为PDF文件的方法.分享给大家供大家参考,具体如下: <?php set_time_limit(0); function MakePropertyValue($name,$value,$osm){ $oStruct = $osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue"); $oStruct->Name = $name; $oStruct->V

总结UNIX/LINUX下C++程序计时的方法_C 语言

前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序计时产生影响. 下面看看小编为大家整理几个计时方法 方法一: 如果是想统计某个程序的运行时间,那么可以使用 time ./a.out 方法二: 如果是想对某个函数或者语句进行计时,那么有别的方法.比如说,gettimeofday函数.直接贴示例代码: #include <sys/time.h> v

Linux下C程序的编辑,编译和运行以及调试

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为"中国PE第一股",市值超1000亿元.  -----------------------------------------------------------------------------

linux下c程序调用reboot函数实现直接重启【转】

转自:http://www.blog.chinaunix.net/uid-20564848-id-73878.html linux下c程序调用reboot函数实现直接重启   当然你也可以直接调用system("reboot"),但是这里完全基于库函数来实现,不依赖于/sbin/reboot这个外部程序这里reboot()的其他命令,比如RB_POWER_OFF,并不能保证关闭计算机电源. #include <unistd.h>#include <sys/reboot

Linux下PhpMyAdmin程序目录的安全管理

安全|程序     Linux下开发Web程序,现在很流行的开发方法为:用PHP开发Web程序,用Apache做Web Server,Mysql充当后台管理数据库.这种组合使得开发Web程序简单.安全.效率高.由于程序是在Linux下运行,虽免去了版权费用,对数据库的管理却少了Windows下的图形界面管理工具,因此使用起来有点困难.现在有了一套由php开发爱好者写的管理Linux下数据库的程序, phpMyAdmin可极好的解决使用的易用性问题.