【问题标题】:Root and other accounts using more file descriptions than what ulimit is configured with使用比 ulimit 配置更多的文件描述的 root 和其他帐户
【发布时间】:2019-03-15 14:16:50
【问题描述】:

现在我下这个问题之前也有人问过,不过大家好像都显示了软限制。我关心的是一个进程的文件描述符 (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 的公司增加了这一点,但尚未更改根目录,因为我希望了解正在发生的事情。

问题

系统如何使用比硬限制配置更多的 fd?

对于分叉过程,这是由系统完成还是由您正在编写的应用程序完成?在我们的软件中,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

【问题讨论】:

    标签: java process linux-kernel file-descriptor ulimit


    【解决方案1】:

    原来问题与“左手不知道右手在做什么”有关。似乎一个团队正在从系统级别设置限制,但另一个团队是从/etc/default/jetty 的配置文件中进行的。取决于码头是从交互式 shell 还是非交互式 shell 触发的,取决于它使用的设置。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多