`
iamzhongyong
  • 浏览: 805377 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

线上too many open files问题排查记录

阅读更多

        周三上午刚到工位,看到群里大家在讨论问题,就好奇一起看了一下,经过两个多小时的折腾,问题定位并解决,中间走了一些弯路,收获就是知道了“Too many open files”了,本来想整理一下自己的疑问写篇文章的,昨晚发现毕玄@bluedavy把问题整理了一下(http://hellojava.info/?p=79),学习了,但是我觉得我还是有必要站在自己的角度整理一下。

        首先介绍一下我遇到的问题。

        线上大量报远程调用超时,然后线上一个应用的集群有一台机器调用失败很多,有大量的异常,异常信息包含“too many open files”,最后定为是重启java进程的时候,文件最大打开数被设置小了。 java进程重启后解决。

        1、如何产看java进程能够打开的最大文件数?

        命令如下“cat /proc/[pid]/limits”,max open files就是能够打开的最大文件数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat /proc/`pgrep java -u admin`/limits
------------------------------------------------------------------
Limit                     Soft Limit           Hard Limit           Units    
Max cpu time              unlimited            unlimited            seconds  
Max file size             unlimited            unlimited            bytes    
Max data size             unlimited            unlimited            bytes    
Max stack size            10485760             unlimited            bytes    
Max core file size        unlimited            unlimited            bytes    
Max resident set          unlimited            unlimited            bytes    
Max processes             393208               393208               processes
Max open files            131072               131072               files    
Max locked memory         32768                32768                bytes    
Max address space         unlimited            unlimited            bytes    
Max file locks            unlimited            unlimited            locks    
Max pending signals       393208               393208               signals  
Max msgqueue size         819200               819200               bytes    
Max nice priority         0                    0                   
Max realtime priority     0                    0

        2.如何产看java进程现在打开的文件数量呢?

        命令如下:lsof -p [pid] | wc -l

        例子:sudo -u admin  lsof -p `pgrep java -u admin` >/tmp/java_pid_lsof.log

        其中web应有中jar包的加载,TCP链接都占用文件数。

        3、java进程的这些限制是如何赋值的呢?

        一种是在java进程的启动脚本中控制的,例如ulimit -n number,

如果没有设置,则进程父进程的限制,如果父进程也没有,则继承当前用户的设置。

        4、如何查看特定用户的限制?

        通过ulimit -a 来查看当前用户的限制描述。

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

        如果是admin用户,需要sudo的场景:sudo -u admin sh -c "ulimit -a"

        5、系统级的限制怎么看?

        两途径查看,系统级的限制对所有用户生效。

        第一种:cat /proc/sys/fs/file-max 

        第二种:sysctl -a | grep file-max

        6、一个文件被那些进程打开,如何查看?

        lsof path/filename

1
2
3
4
5
sudo -u admin   lsof zookeeper-3.3.2.jar
---------------------------------------------
COMMAND  PID  USER   FD   TYPE DEVICE    SIZE    NODE NAME
java    7004 admin  mem    REG  202,9 1015297 2717181 zookeeper-3.3.2.jar
java    7004 admin  366r   REG  202,9 1015297 2717181 zookeeper-3.3.2.jar

        参考文章:

        1、http://langyu.iteye.com/blog/763247

        2、http://hellojava.info/?p=79

    ​    ​然后再贴一个放翁的微博,细节是问出来的。

    ​    ​

 
3
0
分享到:
评论

相关推荐

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

    HTTPConnectionPool(host=‘t.tips', port=80): Max retries exceeded with url: /index.php (Caused by NewConnectionError('<requests>: Failed to establish a new connection: [Errno 24] Too many ope

    mysql too many open connections问题解决方法

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

    toomanyopenfiles的原理和解决方案.docx

    总结来说,解决"Too many open files"的问题,需要理解错误产生的原因,通过`lsof`等工具进行诊断,定位到问题进程,然后修复代码中可能导致泄露的部分。如果必要,还需要调整系统配置以适应更高的文件句柄需求。...

    Linux系统调用出错errno描述一览

    #### 23 ENFILE -- Too many open files in system 系统中的打开文件过多。这通常发生在系统级别的文件描述符耗尽时。 #### 24 EMFILE -- Too many open files 打开文件过多。这通常发生在进程级别的文件描述符耗尽...

    Linux操作系统错误代码解释-(中英文对照)

    24. **OS error code 23: Too many open files in system** - **操作系统错误代码23:打开太多的文件系统** - 当系统达到其最大允许打开文件数量时,会发生此错误。可以通过增加系统配置中的文件句柄数量来解决。 ...

    oracle 19c参数

    过低可能导致 cursor: open too many cursors 错误,过高则会消耗大量内存。 14. **control_files**:控制文件的数量和位置影响数据库的恢复速度和稳定性。建议至少有两份,分布在不同的物理介质上,以实现冗余。 ...

    free pascal 错误表

    打开文件过多 (4 Too many open files) 当系统达到其可以同时打开的最大文件数量限制时,就会出现此错误。每种操作系统都有其自身的限制,例如 Linux 和 macOS 默认限制通常是 1024 个文件。要解决这个问题,可以...

Global site tag (gtag.js) - Google Analytics