我们最近开始对我们的应用程序进行负载测试,并注意到它在大约 24 小时后耗尽了文件描述符。
我们在戴尔 1955 上运行 RHEL 5:
CPU:2 x 双核 2.66GHz 4MB 5150 / 1333FSB RAM:8GB RAM 硬盘:2 x 160GB 2.5" SATA 硬盘
我检查了文件描述符限制,它设置为 1024。考虑到我们的应用程序可能有大约 1000 个传入连接和 1000 个传出连接,这似乎相当低。更不用说任何需要打开的实际文件。
我的第一个想法是将 ulimit -n 参数增加几个数量级,然后重新运行测试,但我想知道将此变量设置得太高的任何潜在后果。
除了弄清楚我们的软件理论上可以打开多少个文件描述符之外,是否有任何最佳实践来设置它?
这些限制来自多个“普通”用户(不是应用程序)共享服务器的时代,我们需要保护他们免于使用过多资源的方法。
它们对于高性能服务器来说非常低,我们通常将它们设置为非常高的数字。(24k 左右)如果需要更高的数字,还需要更改 sysctl file-max 选项(一般在 ubuntu 上限制为 40k,在 rhel 上限制为 70k)。
设置ulimit:
Sysctl 最大文件:
此外,非常重要的是,您可能需要检查您的应用程序是否存在内存/文件描述符泄漏。使用 lsof 查看它打开的所有内容,看看它们是否有效。不要试图改变你的系统来解决应用程序的错误。
你总是可以
在“高负载”情况下查看有多少文件描述符正在使用中。
至于最大 - 它只取决于你在做什么。
如果文件描述符是 tcp 套接字等,那么您可能会为套接字缓冲区和其他内核对象占用大量内存;此内存不可交换。
但除此之外,不,原则上应该没有问题。查阅内核文档以尝试计算它将使用多少内核内存,和/或对其进行测试。
我们运行的数据库服务器打开了大约 10k 个文件描述符(主要是在真实的磁盘文件上),没有什么大问题,但它们是 64 位的并且有大量的内存。
ulimit 设置是每个进程的,但也有系统范围的限制(我认为默认情况下为 32k)
我个人不知道任何最佳实践。取决于系统功能,这有点主观。
请记住,您看到的 1024 是每个用户的限制,而不是系统范围的限制。考虑您在该系统上运行了多少应用程序。这是唯一的吗?运行此应用程序的用户是否在做其他事情?(IE 您是否有人使用此帐户登录和运行可能会逃跑的脚本?)
鉴于该盒子仅运行这一个应用程序并且运行所述应用程序的帐户仅用于此目的,我认为按照您的建议增加您的限制没有任何害处。如果是内部开发团队,我会征求他们的意见。如果它来自第三方供应商,他们可能有特定的要求或建议。
在我看来,这似乎是“在开发环境中测试它”最好回答的问题之一。我记得几年前,当你搞砸这件事时,Sun 很紧张,但没那么紧张。当时的限制也是1024,所以我有点惊讶地发现现在Linux也一样,似乎应该更高。
当我搜索您的问题的答案时,我发现以下链接具有教育意义:http: //www.netadmintools.com/art295.html
还有这个: https ://stackoverflow.com/questions/1212925/on-linux-set-maximum-open-files-to-unlimited-possible