在Linux下查看一个进程打开的文件句柄数以及如何修改。系统默认值为1024。对于一般应用程序(如Apache、系统进程),1024完全足够。但是squid、mysql、java等单个进程处理大量请求就有点捉襟见肘了。如果单个进程打开的文件句柄数超过系统定义的值,就会提示“打开的文件太多”的错误信息。如何知道当前进程打开了多少个文件句柄?下面这个小脚本可以帮你查看:1.lsof-n|awk'{print$2}'|sort|uniq-c|sort-nr|more在系统访问高峰期以root用户执行上面的脚本,有可能是结果如下:1.#lsof-n|awk'{print$2}'|sort|uniq-c|sort-nr|more13124204572424457242315624264第一行是打开的文件句柄数,第二行是进程号。得到进程ID后,我们可以通过ps命令获取进程的详细信息。1.ps-aef|grep242042.mysql24204241629916:15?00:24:25/usr/sbin/mysqld哦,原来mysql进程打开的文件句柄最多。但是他目前只有131个打开的文件句柄,远低于系统默认值1024。但是如果系统并发量特别大,尤其是squid服务器,很有可能会超过1024,这时候就需要调整系统参数以适应应用的变化。Linux有硬限制和软限制。这两个参数可以通过ulimit来设置。方法如下,以root用户执行以下命令:1.ulimit-HSn4096上述命令中H指定硬大小,S指定软大小,n表示设置最大打开文件句柄数一个单一的过程。个人觉得最好不要超过4096,毕竟打开的文件句柄越多,响应时间就越慢。设置句柄数后,系统重启后恢复默认值。如果想永久保存,可以修改/etc/profile,在最后添加上面的命令。(findsun提出的方法比较合理)////////////////////////////////////////////////////////////////////////////在Linux下部署应用时,有时Socket/File:打不开那么多文件,其实Linux有文件句柄限制(像WinXP?),而且默认不是很高,一般是1024,作为生产服务器,其实很容易达到这个数量,所以我们需要把这个值改成一个更大的值。我大概知道ulimit命令是相关的。我google了一下,大部分说的很笼统,没有统一说。两个小时看了很多文章,终于弄明白了ulimit相关的一些配置问题。我们可以使用ulimit-a查看所有的限制值,我只关心打开文件的文件句柄数(-n)1024这个就是限制数这里有很多ulimit的文章说的很含糊,毕竟这个1024是一个系统限制,或者用户限制。其实这来自于用户限制。完整的说应该是当前用户要运行的程序的限制。1.此限制针对单个程序。2、这个限制不会改变之前运行过的程序的限制。3、修改该值,退出当前shell后消失。比如站长博客说的,我先运行创建一个程序A,然后通过ulimit修改limit为2048,然后运行B,然后退出shell重新登录,再运行C,那么只有B可以打开2048个句柄。如果我们需要改变全局限制值,或者我们正在运行的程序被系统启动了,我们应该怎么办?一种方法是将ulimit修改命令放到/etc/profile中,但这不是正确的方法。应该是修改/etc/security/limits.conf
