1、问题阐述:
too many open files:顾名思义即打开过多文件数。
2、产生的原因:
经常在使用linux的时候出现,大多数情况是由于程序没有正常关闭一些资源引起的,所以出现这种情况,请检查io读写,socket通讯等是否正常关闭。
3、经典案例:
很多项目上线不久运行了一段时间后,服务突然宕了,经检查日志,出现了too many open files 错误。
4、解决方案:
前奏:其实Linux是有文件句柄限制的,而且默认不是很高,一般都是1024,作为一台生产服务器,其实很容易就达到 这个数量,因此我们需要把这个值改大一些。我们可以用ulimit -n 来查看当前用户句柄数限制。那么这个1024是系统的限制,还是用户的限制呢。其实,这个是用户限制来的,完整的说法,应该是当前用户准备要运行的程序的限制。
1、这个限制是针对单个程序的限制
2、这个限制不会改变之前已经运行了的程序的限制
3、对这个值的修改,退出了当前的shell就会消失
因此出现这种问题有两种解决方式:
第一:增大文件句柄数。这种方式能及时解决问题,但是不能够彻底的解决问题,可以为彻底解决问题提供一定的时间保证。那么如何增大文件句柄数数呢?
如修改文件句柄数为65535,ulimit -n 65535.此时系统的文件句柄数为65535.
2)将ulimit 值添加到/etc/profile文件中(适用于有root权限登录的系统)
为了每次系统重新启动时,都可以获取更大的ulimit值,将ulimit 加入到/etc/profile 文件底部。
echo ulimit -n 65535 >>/etc/profile
source /etc/profile #加载修改后的profile
ulimit -n #显示65535,修改完毕!
到此为止,你以为大功告成了么,其实不然,突然发现自己再次登录进来的时候,ulimit的值还是1024,这是为什么呢? 用户登录的时候执行sh脚本的顺序:
/etc/profile.d/file
/etc/profile
/etc/bashrc
/mingjie/.bashrc
/mingjie/.bash_profile
由于ulimit -n的脚本命令加载在第二部分,用户登录时由于权限原因在第二步还不能完成ulimit的修改,所以ulimit的值还是系统默认的1024。所以想彻底改变这种问题,就必须做如下操作:修改/etc/security/limits.conf
里面有很详细的注释,比如
* soft nofile 2048
* hard nofile 32768
就可以将文件句柄限制统一改成软2048,硬32768
那么什么是软限制,什么是硬限制
硬限制是实际的限制,而软限制,是warnning限制,只会做出warning
这样就实实际际的增大了文件句柄数。
第二:分析句柄数,查找原因,这是解决问题最根本的办法。那么如何分析那,就需要用到lsof这个命令了(关于这个命令大家可以在网上学习学习)。
(1)统计各进程打开句柄数:lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr
(2)统计各用户打开句柄数:lsof -n|awk '{print $3}'|sort|uniq -c|sort -nr
(3)统计各命令打开句柄数:lsof -n|awk '{print $1}'|sort|uniq -c|sort -nr
就掌商通来说,通过命令分析发现是一个叫xmpp的东西打开的连接数居多,占到了单个进程总打开连接数的百分之八十以上,再仔细分析,xmpp是消息推送产生的连接,那么到这里问题比较明确了,接下来就是要分析为什么消息推送会打开如此多的文件句柄,且一直连着也不断开。这样问题就定位了。另外还有一些进程打开文件句柄数也比较多,这时你可以对比其他服务器,看是否其他服务器也是如此,以保证全面的解决问题。
<!--EndFragment-->
相关推荐
修改文件句柄数在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。 对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象...
Linux Shell 网络层监控脚本(监控包括:连接数、句柄数及根据监控反馈结果分析)
个人觉得最好不要超过 4096,毕竟打开的文件句柄数越多响应时间肯定会越慢。 在调整进程句柄数后,系统重启后,设定的值将会恢复默认值。如果想永久保存下来,可以修改 .bash_profile 文件或 /etc/profile 文件,将...
总结来说,`shm_linux共享句柄`涉及的是Linux环境下利用`mfd_create`高效实现共享内存的方法,它简化了内存共享的流程,提高了数据交换的速度,并且通过文件描述符提供了更多的控制和管理可能性。`shmsend.c`和`...
linux 系统级别的能够打开的文件句柄的数file-max命令 Linux 系统中,file-max 命令用于设置系统级别的能够打开的文件句柄的数量,这个值决定了 Linux 内核可以分配的文件句柄的最大数量。当系统中的文件句柄数量...
文件句柄 文章目录文件句柄查看用户级别(nofile)单个进程级别(nr_...关于什么是文件句柄,这里不做讨论,其实linux中没有文件句柄,叫做文件描述符fd 超过最大句柄限制,报错:java.io.IOException: Too many open
输出结果包含三个数字,分别表示已分配的文件句柄数、正在使用的文件句柄数和系统文件句柄的最大值。为了永久性地调整这个最大值,需要修改`/etc/sysctl.conf`文件中的`fs.file-max`参数,例如: ```bash fs.file-...
在Linux系统中,“句柄”这个术语并不常见,但根据题目描述中的信息,这里提到的“句柄”可能是指进程标识符或文件描述符等资源标识符。在Linux和其他类Unix系统中,句柄通常用来标识一个打开的文件或其他系统资源。...
在IT行业中,尤其是在系统编程和低级操作中,文件号(File Number)和文件句柄(File Handle)是两个重要的概念。它们都是操作系统用来标识和管理文件的方式,但使用方式和场景有所不同。本文将深入探讨这两个概念,...
最后,可能还会涉及QT与Linux系统服务的交互,如系统通知、文件系统访问、进程间通信等。 总之,QT与Linux操作系统窗口的学习涵盖了GUI编程、操作系统交互、软件工程等多个方面,对于提升开发者在跨平台应用开发...
`ulimit -n`命令用于查看或设置一个用户在单个会话中能打开的最大文件句柄数。值得注意的是,`ulimit`命令对root用户无效,因为root用户不受这些限制的约束,只会影响到普通用户。 为了提升这个限制,需要进行两步...
设置Linux打开文件句柄/proc/sys/fs/file-max和ulimit -n的区别表示系统级别的能够打开的文件句柄的数量.是对整个系统的限制,并不是
句柄的概念在很多不同的上下文中都有应用,但在这里我们主要关注它在Linux文件系统中的使用。在这个“Linux学习--句柄学习”的主题中,我们将深入探讨Linux句柄的定义、作用以及如何使用它们。 首先,理解什么是...
句柄数,或者说文件描述符,是操作系统分配给进程用于标识和操作文件、网络连接等资源的唯一标识。本文将详细介绍如何在Linux下查看系统进程占用的句柄数。 首先,了解Linux系统默认的句柄数限制是非常必要的。你...
总之,理解Linux文件系统的运作方式以及如何处理已删除文件的空间释放问题是系统管理员必备的技能。通过监控、定位问题文件并采取适当的释放策略,可以有效地管理磁盘空间,确保系统的稳定运行。在日常运维中,应...
4. 编译C/C++代码成动态链接库,如Windows上的`.dll`或Linux上的`.so`文件。 5. 将生成的库文件与Java应用一起部署,Java虚拟机会在运行时自动加载。 总结来说,Java调用Win32获取窗口句柄JNative-1.3.2是一种使用...
以下是对这个早期版本Linux文件系统的主要组件和概念的详细解释: 1. **超级块(Superblock)**: 超级块是文件系统的核心,每个设备都有一个对应的超级块。它存储了关于文件系统的基本信息,例如节点数、逻辑块数、i...
linux下文件描述符最大限制默认最大为1024,通过 [root@localhost ~]# ulimit -n 1024 这个命令可以查看。此值可以修改。 进程的文件描述符,可以通过 [root@localhost ~]# ls -al /proc/13623/fd |wc -l 59 输出...