我们正在Unicorn下运行一个Ruby on Rails web应用程序。 我们的应用程序不是严格限制CPU(我们有一个双核Xeon E5645系统,12个内核,峰值负载平均值大约是6)。 我们最初从40个独angular兽工作人员开始,但随着时间的推移,应用程序内存占用增加 所以,现在我们必须减less工作进程的数量。 我认为标准(CPU核心数+ 1)公式也适用于Unicorn,但是我的同事试图说服我,我们应该为每个CPU预留更多的Unicorn实例并提供这个链接 。 然而,我不确定为什么我们需要在闲置的Unicorn进程上花费太多的内存。
我的问题是:每个CPU核心有多个Unicorn实例的原因是什么? 这是由于独angular兽的一些build筑特性吗? 我知道繁忙的Unicorn进程不能接受新的连接(我们正在使用UNIX域套接字与Unicorn实例进行通信),但是我认为积压是为了解决这个问题。 无论如何,是否有可能为每个CPU规则克服2至8个独angular兽实例?
好的,我终于find了答案。 独angular兽工作者的最佳数量并不直接与CPU核心数量相关,这取决于您的负载和内部应用程序结构/响应能力。 基本上我们使用抽样分析器来确定工人的状态,我们试图保持工人闲置70%,30%做实际工作。 所以,70%的样本应该“等待select()调用来从前端服务器获取请求”。 我们的研究表明,工人只有3个有效的状态:0-30%的样本空闲,30-50%的样本空闲,50-70%的样本空闲(是的,我们可以得到更多的空闲样本,但在那里并不是真正意义上的,因为应用程序的响应速度没有太大变化)。 我们认为0-30%的情况是“红区”,30-50%的情况是“黄区”。
对于CPU绑定作业,你说得对N + 1是正确的。
另一方面,独angular兽不使用线程,所以每个IO操作。 阻塞进程,另一个进程可能会踢入并parsingHTTP头,连接string,并执行每个需要为CPU服务的CPU密集型任务(尽早执行以减less请求延迟)。
你可能想要更多的线程/进程然后核心。 想象一下以下情况:请求。 A需要十倍以上的req。 B,你有几个并发的A请求,并且快速的B请求只是排队等待A-req完成。 所以,如果你能预测大量的请求,你可以用这个数字作为调整系统的另一个指导。