我对如何优化我的Ruby on Rails 3.1.3应用程序的Unicorn设置很感兴趣。我目前在High-CPU超大型实例上产生了14个工作进程,因为我的应用程序在负载测试期间似乎是CPU绑定的。在模拟负载测试中,大约每秒20个请求重放请求,我的实例上的所有8个核心都达到了峰值,并且盒负载达到了7-8。每个独角兽实例的CPU使用率约为56-60%。
我很好奇有什么方法可以优化这一点?我希望能够将每秒更多的请求发送到这种大小的实例上。内存完全正常,所有其他I/O也是如此。在我的测试过程中,CPU被耗尽了。
发布于 2012-06-27 15:39:19
如果你是CPU受限的,你不希望使用比你的核心更多的独角兽进程,否则你会使系统过载并减慢调度器。您可以使用ab在dev box上测试这一点。您将注意到,2个独角兽将超过20个(数量取决于内核,但概念将保持正确)。
此规则的例外情况是如果您的IO已绑定。在这种情况下,添加内存可以容纳尽可能多的独角兽。
一个很好的性能技巧是将IO绑定的请求路由到托管许多独角兽的不同应用服务器。例如,如果您有一个使用慢速sql查询的请求,或者您在等待外部请求,如信用卡交易。如果使用nginx,请为IO绑定请求定义一个上游服务器,将这些urls转发到一个包含40个独角兽的盒子中。CPU受限或非常快的请求,转发到一个包含8个独角兽的盒子(您说您有8个内核,但在aws上,您可能想尝试4-6个,因为它们的调度程序是受管理的,并且已经非常繁忙)。
此外,我不确定你能指望aws给你可靠的CPU使用率,因为你得到的是一个模糊的百分比。
发布于 2012-06-25 11:21:58
首先,你可能不希望实例占用45-60%的cpu。在这种情况下,如果出现流量峰值,则所有实例都会阻塞。
接下来,14个Unicorn实例似乎很大。独角兽不使用线程。相反,每个进程都使用单个线程运行。独角兽的主进程只有在能够处理线程的情况下才会select它。因此,内核数量不是衡量Unicorn性能的指标。
更保守的设置可能在每个实例上使用4个左右的Unicorn进程,每秒可能响应5-8个请求。然后,调整实例数,直到CPU使用率达到35%左右。这将确保在紧张的“每秒20个请求”的情况下的稳定性。
最后,您可以使用God获得更详细的统计数据和详细信息。
发布于 2012-07-04 09:48:02
对于高CPU超大型实例,每秒20个请求是非常低的。很可能是代码有问题。独角兽特有的问题似乎不太可能发生。如果您有疑问,您可以尝试不同的应用程序服务器,并确认它仍然发生。
在这种情况下,我会考虑的问题...
1-你是否在代码中做了一些CPU密集型的事情--可能是一些真正应该在数据库中的事情。例如,如果您带回一个大的记录集,并在ruby/rails中循环遍历它以对其进行排序或执行其他操作,这就解释了在此级别上的CPU瓶颈,而不是在数据库中。在这种情况下,建议修改查询以执行更多操作,并减轻rails的负担。例如,如果您在控制器中对结果集进行排序,而不是通过sql对结果集进行排序,则会导致如下问题。
2-与普通的crud应用程序相比,您是否正在做一些不寻常的事情,比如访问共享资源,或者任何争用可能会成为问题的事情?
3-您是否有任何循环可能会消耗CPU,特别是在资源争用的情况下?
4-尝试解除有问题的控制器逻辑的各个部分。例如,如果您将代码修改为只返回一个静态hello world响应,那么它的伸缩性有多好?我敢打赌,独角兽会突然变得惊人的快。然后尝试重新添加部分代码,直到您发现速度慢的根源。
https://stackoverflow.com/questions/11182975
复制相似问题