开发者社区> double2li> 正文

Linux下查看进程打开的文件句柄数和如何修改

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

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

    对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象squid、mysql、java等单进程处理大量请求的应用来说就有 点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如何知道当前进程打开了多少个文件句柄呢?下面一段小脚本可以帮你查看:

  1. lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more   

在系统访问高峰时间以root用户执行上面的脚本,可能出现的结果如下:

  1. # lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more   
  2.     131 24204  
  3.      57 24244  
  4.      57 24231  
  5.      56 24264  

其中第一行是打开的文件句柄数量,第二行是进程号。得到进程号后,我们可以通过ps命令得到进程的详细内容。

  1. ps -aef|grep 24204  
  2. mysql    24204 24162 99 16:15 ?        00:24:25 /usr/sbin/mysqld  

哦,原来是mysql进程打开最多文件句柄数量。但是他目前只打开了131个文件句柄数量,远远底于系统默认值1024。

但是如果系统并发特别大,尤其是squid服务器,很有可能会超过1024。这时候就必须要调整系统参数,以适应应用变化。Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数。方法如下,以root用户运行以下命令:

  1. ulimit -HSn 4096  

以 上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄数越多响 应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,,可以修改 /etc/profile 把上面命令加到最后。(findsun提出的办法比较合理)

/////////////////////////////////////////////////////////////////////////////

在 Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题,其实Linux是有文件句柄限制的(就像WinXP?),而且默认不是很高,一般都是1024,作为一台生产服务器,其实很容易就达到 这个数量,因此我们需要把这个值改大一些。


大概知道ulimit这个命令是相关的,上Google搜索了一下,大多数说的很含糊,也没有统一说一下,经过两个小时看了不少文章终于弄清楚ulimit相关的一些配置问题。


我们可以用ulimit -a来查看所有限制值,我只关心文件句柄数量的问题


open files (-n) 1024


这个就是限制数量


这里,有很多ulimit的文章都说的很含糊,究竟这个1024是系统的限制,还是用户的限制呢。其实,这个是用户限制来的,完整的说法,应该是当前用户准备要运行的程序的限制。


1、这个限制是针对单个程序的限制

2、这个限制不会改变之前已经运行了的程序的限制

3、对这个值的修改,退出了当前的shell就会消失


比如说,我先运行了一个程序A,然后通过ulimit修改了限制为2048,然后运行B,然后退出了shell再登录,然后运行C。那就只有B可以打开2048个句柄。


如果我们需要改变整体的限制值,或者我们运行的程序是系统启动的,应该怎么处理呢


其中一个方法,是想ulimit修改命令放入/etc/profile里面,但是这个做法并不好


正确的做法,应该是修改/etc/security/limits.conf

里面有很详细的注释,比如


* soft nofile 2048

* hard nofile 32768


就可以将文件句柄限制统一改成软2048,硬32768


这里涉及另外一个问题,什么是软限制,什么是硬限制

硬限制是实际的限制,而软限制,是warnning限制,只会做出warning

其实ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软

默认显示的是软限制,如果修改的时候没有加上的话,就是两个一起改


配置文件最前面的一位是domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制


修改了,重新登录用ulimit一开就立刻生效了,不过之前启动过的程序要重新启动才能使用新的值。我用的是CentOS,似乎有些系统需要重启才能生效。


ulimit其实就是对单一程序的限制


那系统总限制呢

其实是在这里,/proc/sys/fs/file-max

可以通过cat查看目前的值,echo来立刻修改


另外还有一个,/proc/sys/fs/file-nr

只读,可以看到整个系统目前使用的文件句柄数量


查找文件句柄问题的时候,还有一个很实用的程序lsof

可以很方便看到某个进程开了那些句柄

也可以看到某个文件/目录被什么进程占用了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Chromium中跨进程文件句柄传递
实现说明 在Chromium跨进程架构下,也会有Browser/Renderer两个进程对相同文件进行操作的需求。
942 0
Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介
原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理子系统、网络子系统、虚拟文件系统在这个阶段进行分析的,但是为了让大家对内核有个整体的把握,今天还是简单的介绍一下剩余的几个子系统,我们对这几个子系统的分析,只要了解其作用和部分内容即可,不必深究,等我们写上几个驱动,到时候按照驱动再来分析这几个子系统我们就清晰多了。
1022 0
Python 技术篇 - 通过代码查看文本的编码类型实例演示,如何查看文件的编码类型,文件编码查看方法
文件主要分为二进制文件和文本文件这两种,看你想要查看哪种文件的编码,如果是文本文件的话,open 函数里的就要用 r,二进制文件用的是 rb,别搞错哦!
22 0
[雪峰磁针石博客]MD5值重复文件多进程检查工具check_md5.py - 性能测试工具开发
MD5简介 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
1499 0
Linux 中查看进程及资源使用情况
Linux 中查看进程及资源使用情况自带的 top 命令类似于平时我们使用的任务管理器,能够列出当前系统中的进程及资源的使用情况。 $ man top top - display Linux tasks 使用起来很简单,不加任何参数的情况下已经很实用了。
2074 0
+关注
double2li
一个在IT行业摸爬滚打的老司机
2870
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载