java - root 和其他帐户使用的文件描述多于 ulimit 配置的文件描述

标签 java process linux-kernel file-descriptor ulimit

现在我下这个问题已经被问过,但每个人似乎都显示软限制。我关心的是进程如何拥有比硬限制更多的文件描述符 (fd),这对性能意味着什么?

根据其他在线文章,硬限制就是一个硬上限,所以这意味着如果命中就会崩溃?

我应该补充一点,现在系统还没有崩溃,并且目前运行得还不错。我只是想看看如何改进性能,以及对已经存在 15 年的软件带来的好处。

配置

这是一个运行 JAVA 的 Web 服务器,将数据从其他设备传递到 postgresql。

]# cat /proc/sys/fs/file-max
20854863

]# cat /proc/sys/fs/file-nr
43320   0       20854863

运行 su 命令只是为了显示这是针对 root 帐户的。

]# su - root -c "ulimit -Hn -Hu"
open files                      (-n) 4096
max user processes              (-u) 819554

分析

root正在运行923进程

]# lsof -u root | awk '{ print$2 }' | uniq -c | wc -l
923

其中有一个进程的 fd 比配置的要多

]# lsof -u root | awk '{ print$2 }' | uniq -c | 
...
10823 2550
...
]# ls -l /proc/2550/fd/ | wc -l
10675

因此,根据配置,我们可以拥有比打开文件更多的进程,但系统看不到这一点。我们还有另一个用户,公司特定名称,它也有同样的问题。硬限制为 4096,但一个进程的打开文件数为 13112。

此后,我们已将公司的根号增加到 16000,但尚未更改 root,因为我希望了解发生了什么情况。

问题

系统使用的 fd 数量如何超过了硬限制配置的数量?

对于 fork 过程,这是由系统还是您正在编写的应用程序完成的?就我们的软件而言,如果 java 有足够的 fd,似乎很乐意在一个进程下运行。

如果我们将其与 postgres 服务进行比较,一旦达到软限制,postgres 就会很高兴地旋转更多进程,或者只需要做其他事情。

]# lsof -u postgres | awk '{ print$2 }' | uniq -c
      1 PID
    678 1064
    741 1067
    766 1131
    561 1446
    681 1447
   1034 36122
    912 54028
    951 54195
   1026 56139
... about a dozen more records

最佳答案

事实证明,问题与“左手不知道右手在做什么”有关。似乎一个团队正在从系统级别设置限制,但其他团队正在通过 /etc/default/jetty 中的配置文件进行设置。取决于 jetty 是从交互式 shell 触发还是从非交互式 shell 触发,具体取决于它所使用的设置。

换句话说。限制较高,因为 /etc/default/jetty 中的限制设置得高于系统。

关于java - root 和其他帐户使用的文件描述多于 ulimit 配置的文件描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55184614/

相关文章:

c - Linux 中使用 C 的接口(interface)绑定(bind)(聚合)

linux -/proc/kallsyms中的t和t有什么区别

linux - i2c 访问用户空间问题,如何解决这个问题..?

Java android将图片中的黑色更改为tracspadence并保存在文件中

java - 如何用我自己的 readObject 调用替换 Java 的默认反序列化?

java - 无法将 JSON 发送到 Spring Boot 应用程序中的其余端点

java - 如何使用参数指定分段文件上传

delphi - TProcessInfo - 获取进程的完整路径

process - 优先老化作为进程调度策略。有哪些优点和缺点?

c# - 杀死应用程序实例的最佳方法