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