现在我下这个问题已经被问过,但每个人似乎都显示软限制。我关心的是进程如何拥有比硬限制更多的文件描述符 (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/