`
xupo
  • 浏览: 214856 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Too many open files 问题的解决

 
阅读更多

在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 ,毕竟打开的文件句柄数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件 ,可以修改 /etc/profile 把上面命令加到最后。(findsun提出的办法比较合理)

=================================================================================

Too many open files经常在使用linux的时候出现,大多数情况是您的程序没有正常关闭一些资源引起的,所以出现这种情况,请检查io读写,socket通讯等是否正常关闭。

如果检查程序没有问题,那就有可能是linux默认的open files值太小,不能满足当前程序默认值的要求,比如数据库连接池的个数,tomcat请求连接的个数等。。。

查看当前系统open files的默认值,可执行:

Java代码 复制代码
  1. [root @pororo script]# ulimit -a   
  2. core file size           (blocks, -c) 0   
  3. data seg size            (kbytes, -d) unlimited   
  4. scheduling priority              (-e) 0   
  5. file size                (blocks, -f) unlimited   
  6. pending signals                  (-i) 128161   
  7. max locked memory        (kbytes, -l) 32   
  8. max memory size          (kbytes, -m) unlimited   
  9. open files                       (-n) 800000   
  10. pipe size             ( 512 bytes, -p) 8   
  11. POSIX message queues      (bytes, -q) 819200   
  12. real-time priority               (-r) 0   
  13. stack size               (kbytes, -s) 10240   
  14. cpu time                (seconds, -t) unlimited   
  15. max user processes               (-u) 128161   
  16. virtual memory           (kbytes, -v) unlimited   
  17. file locks                       (-x) unlimited  


如果发现open files项比较小,可以按如下方式更改:

1. 检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。

Java代码 复制代码
  1. # cat /proc/sys/fs/file-max  


如果设置值太小,修改文件/etc/sysctl.conf的变量到合适的值。这样会在每次重启之后生效。 如果设置值够大,跳过这一步。

Java代码 复制代码
  1. # echo 2048 > /proc/sys/fs/file-max  


编辑文件/etc/sysctl.conf,插入下行:

Java代码 复制代码
  1. fs.file-max = 8192   


2. 在/etc/security/limits.conf文件中设置最大打开文件数, 下面是一行提示:

Java代码 复制代码
  1. #<domain>   <type>   <item>   <value>  


添加如下这行:

Java代码 复制代码
  1. * - nofile 8192   


这行设置了每个用户的默认打开文件数为2048。 注意"nofile"项有两个可能的限制措施。就是<type>项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用"-"字符设定<type>, 则hard和soft设定会同时被设定。

硬限制表明soft限制中所能设定的最大值。 soft限制指的是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。

当增加文件限制描述,可以简单的把当前值双倍。 例子如下, 如果你要提高默认值1024, 最好提高到2048, 如果还要继续增加, 就需要设置成4096。

最后用ulimit -a再次查看,open files的值,没什么问题的话,就已经改过来了。
分享到:
评论

相关推荐

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法 JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES错误是一种常见的网络编程错误,发生在Java应用程序中, especialmente 在 Linux 操作系统中。该错误的出现是...

    Too many open files 问题的解决.txt

    ### Too many open files 问题详解与解决方案 在Linux系统中,“Too many open files”错误是一个常见的性能瓶颈,尤其是在运行大量并发服务或应用时。这个问题的根本在于操作系统对每个进程可打开的文件数量有限制...

    Too many open files 解决方法

    ### Too many open files 解决方法 #### 背景与问题描述 在将Web服务器从Windows环境迁移到Linux环境后,...通过上述解决方案,可以有效地解决“Too many open files”问题,保证Web服务器在高并发环境下的稳定运行。

    报错:too many open files处理

    总的来说,“too many open files”是一个常见的运行时问题,通过理解操作系统限制和程序设计原则,我们可以有效地预防和解决这个问题。对于开发者而言,熟悉这些技巧不仅能提高应用的稳定性和性能,还能避免因错误...

    java.io.FileNotFoundException: *****(Too many open files)

    在Java编程中,"java.io.FileNotFoundException: ***** (Too many open files)" 是一个常见的错误,意味着程序尝试打开的文件数量超过了操作系统的限制。这个错误通常出现在处理大量文件或长时间运行的程序中,尤其...

    linux too many open files解决方案.docx

    Linux too many open files 解决方案 Linux 系统中的打开文件数量限制问题是系统对程序打开文件数量的限制问题。...通过修改打开文件数量限制和核心文件大小限制,可以解决 Linux 系统中的 Too many open files 问题。

    Linux报too many open files的解决方案

    Linux系统在运行时经常会出现"too many open files"(文件打开过多)的错误,这是一个非常常见的问题,通常发生在当系统运行的应用程序尝试打开的文件数量超过了系统限制时。为了解决这个问题,我们可以从两个方面...

    AIX关于Weblogic的报错_Too_many_open_files_的处理

    通过上述步骤,我们可以有效地解决AIX环境下Weblogic遇到的“Too many open files”问题。这不仅涉及了系统层面的资源限制调整,还包括了应用级别的优化措施。在实际操作过程中,还需要根据具体情况灵活调整,确保...

    访问应用很慢,访问Nginx时,报错:accept() failed (24 Too many open files).docx

    下面是解决这个问题的方法。 一、临时修改 ulimit 值 可以使用 ulimit 命令来临时修改打开文件数的限制。例如,使用以下命令可以将打开文件数设置为 655360: [root@kvm-server nginx]# ulimit -n 655360 这将...

    Python错误提示:[Errno 24] Too many open files的分析与解决

    在Python编程过程中,可能会遇到一个常见的错误提示:“[Errno 24] Too many open files”。这个错误通常意味着你的程序尝试打开的文件句柄超过了操作系统允许的最大限制。下面我们将深入探讨这个问题的原因、如何...

    socket accept报too many open files的原因

    socket accept报Too many open files的原因

    mysql too many open connections问题解决方法

    MySQL中的“Too many open connections”错误...通过以上措施,可以有效地解决或预防“Too many open connections”的问题,保证MySQL服务器的稳定运行。同时,定期审查并调整这些设置,以适应应用程序的增长和变化。

    Linux下打开的文件过多错误

    Linux下运行tomcat或者was出现java.net.SocketException: 打开的文件过多错误 tomcat报“too many open files”的错误,解决办法如下:

    39 案例实战:如何解决经典的Too many connections故障?背后原理是什么.pdf

    Too many connections故障是数据库运维中较为常见的问题,特别是在并发访问量较大的Web应用中,其背后的原理和解决方法值得深入探讨。 在Linux系统中,每个进程可用的文件句柄(file handles)数量是有限制的。文件...

    Ansj中文分词(强大)

    如果你发现此模式分词存在问题.可以看.新词发现.是此分词的初始版本! 此分词保证了准确率,具有人名识别的功能! 此分词结果,具有新词发现,人名识别,机构名识别.也许准确率稍差.但是非常具有应用价值! 献给广大使用...

    nginx fastdfs.docx

    搭建 Nginx 与 FastDFS 的组合,是一种常见的文件存储和分发解决方案。FastDFS 是一个开源的轻量级分布式文件系统,而 Nginx 作为高性能的 Web 服务器和反向代理服务器,两者结合能够提供稳定、高效的文件上传和下载...

    http连接关闭

    too many open files问题分析和解决

    2008mvp.zip

    1. **微软最有价值专家(MVP)计划**:这是一个由微软公司设立的荣誉奖项,授予那些在技术社区中分享知识、帮助他人解决问题并对微软技术做出贡献的专家。 2. **申请流程**:文件可能详细介绍了2008年申请MVP的过程,...

    Hadoop问题处理

    在Hadoop集群中,遇到`java.io.IOException: Too many open file`和`java.lang.OutOfMemoryError`这两种异常,通常是由于资源限制或管理不当引起的。本文将深入探讨这两种错误的成因、解决策略以及如何避免它们。 1...

Global site tag (gtag.js) - Google Analytics