【发布时间】: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