在我工作的地方,我们构建和分发了一个库和一些基于该库构建的复杂程序.所有代码都是用C语言编写的,并且可以在大多数"标准"系统上使用,如Windows,Linux,Aix,Solaris,Darwin.
我从QA部门开始,在最近运行测试时,我已多次提醒我需要记住设置文件描述符限制和默认堆栈大小更高或坏事情将发生.Solaris和现在的Darwin尤其如此.
现在这对我来说非常奇怪,因为我是一个相信0所需的环境,摆弄产品.所以我想知道是否有时候这种要求是必要的邪恶,或者我们做错了什么.
编辑:
描述问题和一些背景的好评.但是我不相信我的问题已经足够好了.目前,我们要求客户以及测试人员在运行我们的代码之前设置这些限制.我们不是以编程方式执行此操作.并且这不是他们可能用完的情况,在正常负载下我们的程序会耗尽并且出现故障.重新提出这个问题,是否要求客户更改这些ulimit值以在某些平台上运行我们的软件,即Solaris,Aix,还是我们作为一家公司让这些用户难以开始?
Bounty:我添加了一笔赏金,希望能够获得更多关于其他公司正在采取哪些措施来管理这些限制的信息.你能用实际设置吗?我们应该吗?我们的计划是否应该达到这些限制,或者这可能是一个迹象表明事情可能有点凌乱?这真的是我想要知道的,作为一个完美主义者,一个看似肮脏的程序真的让我感到困惑.
如果您需要更改这些值以使QA测试运行,那么这不是太大的问题.但是,要求客户执行此操作以便程序运行应避免(恕我直言).如果不出意外,请创建一个包装器脚本来设置这些值并启动应用程序,以便用户仍然可以单击一次启动应用程序.但是,从程序中设置这些将是更好的方法.至少,如果限制太低,让程序在启动时检查限制并且(干净地)错误地提前输出.
如果软件开发人员告诉我,我必须弄乱我的堆栈和描述符限制才能运行程序,这会改变我对软件的看法.这会让我想知道"为什么他们需要超出我所拥有的其他软件显然可以接受的系统限制?".这可能是也可能不是一个有效的问题,但被要求做一些(对许多人来说)似乎是hackish的事情并不像你刚刚启动和去的那样具有相同的专业优势.
当你说"这不是他们可能用完的情况时,这个问题似乎更糟,在正常负载下我们的程序会耗尽并且出现故障".超出这些限制的程序是一回事,但是一个不能优雅地处理因超出这些限制而导致的错误条件的程序则是另一回事.如果您达到文件句柄限制并尝试打开文件,则应该收到错误消息,指示您打开了太多文件.这不应该导致程序设计良好的程序崩溃.检测堆栈使用问题可能更困难,但是文件描述符的耗尽不应该导致崩溃.
你没有提供关于这是什么类型的程序的详细信息,但我认为假设程序的用户必须具有足够的权限来更改这些值是不安全的.在任何情况下,假设在程序运行时没有其他任何东西可能会在用户不知情的情况下运行时,也可能不安全.
虽然总有例外,但我会说,一般来说,超出这些限制的程序需要重新检查其代码.限制是有原因的,并且系统中的几乎所有其他软件都在这些限制范围内工作而没有任何问题.您是否真的需要同时打开多个文件,或者打开一些文件,处理它们,关闭它们还打开更多文件会更清晰吗?您的图书馆/程序是否试图在一个大捆绑中做太多,或者将它分解为一起工作的较小的独立部分会更好吗?您是否超出了堆栈限制,因为您正在使用可以以非递归方式重写的深度递归算法?可能有许多方法可以改进有问题的库和程序,以便减少更改系统资源限制的需要.