前段时间帮助公司解决了一次tomcat环境服务器的异常,今天有时间过来总结一下。
问题的表现:
tomcat服务在重启之后,短时间内会承受大量访问,由于这个时候缓存还没建立,每次访问都将消耗一定资源(数据库连接或者文件IO),并发量在2000左右的时候tomcat服务开始抛出大量Too Many Open Files的异常,主要是文件IO一块的异常,数据库连接池配置恰当就不会抛异常。
问题分析:
这是一个典型的文件句柄耗尽的异常,在linux里头“一切皆文件”,所以虽然提示“文件”打开太多,其实也有可能是socket打开太多或者设备打开太多。
文件句柄是用来干嘛的?
- 句柄当做一个人的名字,并"可以通过名字(句柄),实现对句子的引用和访问",感觉这种比喻好象贴近,但问题是可能有许多人叫同一个名字,但句柄所以有意义正因为它具有唯一性,所以这种比喻也有问题,如果换个说法,说句柄是表示你的进程与外界的i/o连接,把它当作是一个连接的名字是不是更恰当些? 文件句柄是一个十六位长度的二进制代码(Windows95后为32位无符号整数),代表一个已被打开文件的通道号,借助于这个句柄,你的应用程序即可使用这个相应的句柄对文件进行随意存取操作,说白了文件句柄其实是一串代表着特殊含义的号码; 当然其实系统是用句柄与一些资源联系起来的,当由系统管理,动态分配给你应用程序的某些资源的代号,你就可以使用句柄访问相应的资源了,尤其在Windows系统中,有很多东东都使用句柄,如窗口,socket。
简单看来程序通过句柄获得资源的引用,来进行资源的打开和关闭的操作。
为什么会出现文件句柄耗尽的情况?
主要是因为linux在文件句柄的数目上有两个级别的限制。一个是系统级别的总数限制,一个是针对用户的限制。默认情况下每个用户所能使用的句柄数是1024。一般情况下1024也够用了,但是在大容量的系统上,特别是会频繁使用网络通信和文件IO的系统上,1024很快就被耗光了。所以首先我们要调整这个值。修改方法如下:
- 1. ulimit -a 查看当前用户的文件句柄限制
- 2. 用户级别的句柄数限制修改。
- 修改 /etc/security/limits.conf 增加下面的代码:
- 用户名(或者用*表示所有用户) soft nofile 65535
- 用户名 hard nofile 65535
- 有两种限制,一种是soft软限制,在数目超过软限制的时候系统会给出warning警告,但是达到hard硬限制的时候系统将拒绝或者异常了。
- 修改之后可能需要重启shell生效。
- 3. 系统级别的句柄数限制修改。
- sysctl -w fs.file-max 65536
- 或者
- echo "65536" > /proc/sys/fs/file-max
- 两者作用是相同的,前者改内核参数,后者直接作用于内核参数在虚拟文件系统(procfs, psuedo file system)上对应的文件而已。
- 可以用下面的命令查看新的限制
- sysctl -a | grep fs.file-max
- 或者
- cat /proc/sys/fs/file-max
- 修改内核参数
- /etc/sysctl.conf
- echo "fs.file-max=65536" >> /etc/sysctl.conf
- sysctl -p
- 查看系统总限制 命令:cat /proc/sys/fs/file-max
- 查看整个系统目前使用的文件句柄数量命令:cat /proc/sys/fs/file-nr
- 查看某个进程开了哪些句柄 :lsof -p pid
- 某个进程开了几个句柄 :lsof -p pid |wc -l
- 也可以看到某个目录 /文件被什么进程占用了,显示已打开该目录或文件的所有进程信息 :lsof path/filename
具体这个值应该设置成多少?
优先级(Open File Descriptors):
soft limit < hard limit < kernel < 实现最大file descriptor数采用的数据结构所导致的限制
其实这个值倒是没有具体限制,但是分配的值如果太大反而会影响系统性能,所以要根据具体应用调配权衡。
问题的解决方案:
首先当然是修改linux句柄数限制到一个合适的值。
然后就是应用本身的一个调整。有这么几种情况:
1.数据库连接池的优化。必须要使用连接池,否则句柄没耗光数据库就崩了。。。
2.抓取资源的时候有可能会用到HttpClient,尽量也应该使用连接池来控制连接数。
关于HttpClient的连接池配置可以查看我另外一文:http://blog.csdn.net/shootyou/archive/2011/05/12/6415248.aspx
3.连接池设置的把握,建立连接超时时间,读取超时时间,连接数目,等待时间,等都需要配置到一个合适的值,否则发挥不出连接池的性能。
分享到:
相关推荐
当一个应用(如Apache、MySQL、Java应用服务器等)试图打开超过其最大文件句柄数限制的文件时,就会遇到“Too many open files”的错误。这不仅会阻止进一步的文件操作,还可能引起应用崩溃或服务不可用的情况。 ##...
通过上述步骤,我们可以有效地解决AIX环境下Weblogic遇到的“Too many open files”问题。这不仅涉及了系统层面的资源限制调整,还包括了应用级别的优化措施。在实际操作过程中,还需要根据具体情况灵活调整,确保...
在Python编程过程中,可能会遇到一个常见的错误提示:“[Errno 24] Too many open files”。这个错误通常意味着你的程序尝试打开的文件句柄超过了操作系统允许的最大限制。下面我们将深入探讨这个问题的原因、如何...
在IT行业中,尤其是在编程领域,文件句柄是一个重要的概念,它是操作系统用来标识和管理打开文件的一种方式。在易语言中,处理文件句柄的操作能够帮助开发者更高效地进行文件操作。"易语言根据文件句柄取文件路径"是...
除了文件句柄限制之外,ulimit命令还可以限制其他资源的使用,例如coreFileSize(进程崩溃转储文件大小)、maxLockedMemory(最大锁定内存大小)、openFiles(最大打开文件句柄数)以及maxUserProcesses(最大用户...
当系统中的文件句柄数量达到这个值时,系统将不能再打开新的文件句柄,从而导致“Too many open files in system”错误。 file-max 命令的作用域是系统级别的,而不是进程级别的。它控制着 Linux 内核可以分配的...
为了解决这些问题,你可以尝试先关闭文件句柄,或者以管理员权限运行Tomcat。 ```java File file = new File(filePath); if (file.delete()) { System.out.println("文件删除成功"); } else { System.out.println...
总的来说,掌握在易语言中根据文件句柄获取文件路径的方法是进行文件操作的基础,通过不断学习和实践,你可以更熟练地运用易语言来解决实际的编程问题。同时,利用社区资源,如源码分享站,可以加速学习进程,提高...
如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如何知道当前进程打开了多少个文件句柄呢?下面一段小脚本可以帮你查看: 1.lsof -n |awk ‘{print $2}’|sort|...
数据库无法连接故障的定位,Too many connections(连接过多)是数据库管理员经常面临的问题。当业务系统尝试连接数据库时,如果数据库的连接数已经达到上限,那么新的连接请求就无法建立,这时就会抛出“Too many ...
从打开的文件句柄获得文件的路径.根据HANDLE获得文件路径
`ZwQuerySystemInformation`结合`SystemProcessInformation`可以揭示进程所持有的所有文件句柄,这对于排查问题、审计文件访问行为或者实现高级监控工具至关重要。 在实现这一功能时,开发者通常需要以下步骤: 1. ...
通过学习和使用这个模块,开发者可以提高其在易语言环境下的文件操作能力。 总的来说,文件号和文件句柄是操作系统管理文件的关键元素,而易语言提供了工具和方法来处理这两种标识符的转换。理解这些概念以及如何在...
在vue开发时需要在页面跳转的时候传递文件句柄,又不想用vuex来传递,因为vuex使用有些大材小用,说以用mitt,也就是vue2的eventbus。vue3没有eventbus,所以使用mitt,来传递文件句柄,在另一个页面就可以拿到文件...
标题中的“这个东西可以查看文件句柄”表明我们要讨论的是一个工具或软件,它具有查看系统中打开文件的句柄信息的功能。句柄在计算机科学中是一个标识符,操作系统通过句柄来管理和操作文件或其他系统资源。这个工具...
《文件句柄冲突检测器——Unlock Wizard深度解析》 在日常的计算机操作中,我们时常会遇到这样的问题:想要删除或移动一个文件时,系统提示该文件正在被其他程序使用,无法进行操作。这时,Unlock Wizard这样的工具...
在Windows操作系统中,"句柄"(handle)...总结来说,这个主题的核心是通过句柄来追踪文件使用情况,这在系统调试、性能优化或者问题排查中非常有用。理解并掌握这一技术能帮助IT专业人员更好地理解和控制他们的系统。
在Windows操作系统中,句柄(Handle)是一种标识符,用于唯一地引用系统资源,如文件、设备、进程、线程等。"枚举当前系统的所有已打开文件的句柄及路径"这一主题涉及到Windows API调用和系统底层的交互,主要用于...
易语言源码易语言文件号和文件句柄互转模块源码.rar 易语言源码易语言文件号和文件句柄互转模块源码.rar 易语言源码易语言文件号和文件句柄互转模块源码.rar 易语言源码易语言文件号和文件句柄互转模块源码.rar ...
"Too many open files" 是一个在Linux系统中常见的错误,主要出现在系统无法处理当前进程中打开的文件句柄数量超过系统设定限制时。该错误通常发生在云服务器上,尤其是在运行复杂应用或服务时。理解这个错误的原理...