`

linux文件句柄数

阅读更多

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下查看进程打开的文件句柄数和如何修改方法

    修改文件句柄数在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。 对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象...

    Linux Shell 网络层监控脚本(监控包括:连接数、句柄数及根据监控反馈结果分析)

    Linux Shell 网络层监控脚本(监控包括:连接数、句柄数及根据监控反馈结果分析)

    Linux文件句柄限制总结

    文件句柄 文章目录文件句柄查看用户级别(nofile)单个进程级别(nr_...关于什么是文件句柄,这里不做讨论,其实linux中没有文件句柄,叫做文件描述符fd 超过最大句柄限制,报错:java.io.IOException: Too many open

    linux的最大进程句柄数设置

    linux的最大进程句柄数设置在Linux下,我们使用ulimit -n命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。

    QT及LINUX操作系统窗口

    QT及LINUX操作系统窗口,作者:倪继利。 超星格式文档。

    linux系统级别的能够打开的文件句柄的数file-max命令.docx

    linux系统级别的能够打开的文件句柄的数file-max命令.docx

    marmot-cn#readingNotes#设置linux打开文件句柄:proc:sys:fs:file-max和ulimit

    设置Linux打开文件句柄/proc/sys/fs/file-max和ulimit -n的区别表示系统级别的能够打开的文件句柄的数量.是对整个系统的限制,并不是

    linux下查看系统进程占用的句柄数方法

    —查看系统默认的最大文件句柄数,系统默认是1024 # ulimit -n 1024 —-查看当前进程打开了多少句柄数 # lsof -n|awk ‘{print $2}’|sort|uniq -c|sort -nr|more 131 24204  57 24244  57 24231 …….. 其中第一...

    Linux文件存在程序找不到文件.pdf

    Linux⽂件存在程序找不到⽂件 ⽂件存在程序找不到⽂件 1. 编码格式 编码格式 程序运⾏时的编码格式和传输... ⽂件句柄数 ⽂件句柄数 极端情况下,操作系统打开的⽂件句柄数达到上限,没有可⽤的⽂件句柄⽤于打开⽂件。

    Linux如何处理文件已删除但空间不释放的问题

    主要介绍了Linux如何处理文件已删除但空间不释放的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Linux磁盘空间被未知资源耗尽的解决方法

    遇到这种情况,基本可以断定是某些大文件被某些程序占用了,并且这些大文件已经被删除了,但是对应的文件句柄没有被某些程序关闭,造成内核无法回收这些文件占用的空间。 那么,如何查找那些文件被某些程序占用呢,...

    增加系统的最大打开文件数

    这个数字说明了一个普通用户能够在一个单独会话中所能打开最大的文件数目。注意。如果是root,以下操作不能使ulimit -n的输出增加。因为用户root用户不受这个ulimit限制。只有普通用户才会受这个限制。

    3 种方法教你在 Linux 中修改打开文件数量限制.doc

    当文件被打开访问时,操作系统临时分配一个名为文件句柄的数字。主内存的一个特殊区域是为文件句柄预留的,这个区域的大小决定了一次可以打开多少个文件。

    基于select的Linux串口485读写,文件描述符 fd_set

    基于linux ,使用select检测串口句柄事件,同时进行超时判断的串口485读写操作。为高效可控的linux串口操作例程。tcsetattr,tcflush,select,ioctl,gettimeofday。485收发方向切换。

    VC实现读写文件的三种方法

    1.Linux下文件句柄方式,写二进制文件时一定要用O_BINARY 2.CFile,MFC封装的形式,不区分二进制或者文本文件方式读写 3.FILE,文件指针形式,写二进制文件时一定要用wb

    linux 下通过socket 传递共享内存句柄,实现共享内存操作

    1. 文件命名式的内存共享, 容易造成安全问题,会被第三方读取 2. 父子进程共享内存句柄继承方式的 , 需要父子关系 3. 通过socket 进行内存句柄的传递, 避免第三者获取 这里介绍的就是3方式进行共享内存在进程间...

    linux下文件描述符限制问题

    linux下文件描述符最大限制默认最大为1024,通过 [root@localhost ~]# ulimit -n 1024 这个命令可以查看。此值可以修改。 进程的文件描述符,可以通过 [root@localhost ~]# ls -al /proc/13623/fd |wc -l 59 输出...

    linux常用命令脚本.txt

    # 查看当前进程打开了多少个文件句柄呢 lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more # 禁止接收从 DNS 服务器发送过来并包含 googleusercontent 的包 iptables -I INPUT -p udp --sport 53 -m string -...

    为Linux应用程序编写DLL程序函数

    创建能在运行时被动态链接到 Linux 系统上的应用程序的共享目标代码是一项非常简单的练习。...当需要时,也可对 dll 进行间接函数调用,最后,关闭到共享目标文件的句柄,并且从内存中取消该目标文件映射,使之不可用。

Global site tag (gtag.js) - Google Analytics