独角兽CPU使用率在负载测试期间飙升,优化方法

6

我有兴趣了解如何优化我的Ruby on Rails 3.1.3 应用程序的独角兽(Unicorn)配置。目前,在高CPU额外大实例上,我正在生成14个工作进程,因为在负载测试期间,我的应用程序似乎受到CPU限制。在每秒约20个请求的仿真负载测试中,我的实例上的所有8个核心都达到峰值,并且盒子负载飙升到7-8。每个独角兽实例利用了大约56-60%的CPU。

我想知道如何优化这些问题?我希望能够将更多请求每秒钟传输到这样一个实例。内存完全正常,所有其他I / O也正常。我的测试期间CPU的负荷过高。


你使用 Ruby 1.9 吗?如果没有的话,那可能会有所帮助。 - Reactormonk
4
使用 ruby-prof 对您的代码进行剖析,找出其运行缓慢的原因,尝试重写瓶颈部分。重复此过程,直到速度足够快。如果没有更多信息,我们无法猜测代码为什么速度不够快。 - Frederick Cheung
1
@randombits,如果每个CPU核心只能处理约2个请求/秒,那么你的应用内部肯定有严重的缓慢问题。你不需要优化你的独角兽设置,你需要优化你的应用程序代码。你还没有发布任何分析数据--是因为设置和运行分析工具似乎很麻烦吗?还是你仍然希望通过调整你的独角兽配置来解决问题?(这是不可能的)首先,查看你的Rails日志,确定缓慢的请求,并告诉我们它在"DB"、"View"和总时间方面报告了什么。 - Alex D
3个回答

6
如果你的系统负载在CPU上,最好不要使用多于核心数量的unicorn进程,否则会超载系统并降低调度器速度。你可以在开发盒上使用ab进行测试。你会发现2个unicorn的性能优于20个(数字取决于核心数量,但概念仍然成立)。
唯一的例外是如果你的负载集中在I/O上。这种情况下,可以根据内存容量添加尽可能多的unicorn。
一个好的性能技巧是将I/O请求路由到托管许多unicorn的不同应用服务器。例如,如果你有一个需要慢速SQL查询或等待外部请求(如信用卡交易)的请求。如果使用nginx,请为I/O绑定请求定义一个上游服务器,将这些URL转发到具有40个unicorns的服务器上。将CPU负载或非常快的请求转发到具有8个unicorns的服务器上(你说你有8个核心,但在aws上你可能想尝试4-6,因为它们的调度程序正在虚拟化和繁忙)。
此外,我不确定你是否可以指望aws给你可靠的CPU利用率,因为你得到的是一个模糊百分比的百分比。

1
首先,您可能不希望实例的 CPU 利用率达到 45-60%。在这种情况下,如果出现流量激增,所有实例都会崩溃。
其次,14 个 Unicorn 实例似乎有些多。Unicorn 不使用线程,而是每个进程只运行一个线程。只有当 Unicorn 的主进程能够处理时,才会选择一个线程。因此,核心数不是衡量 Unicorn 性能的指标。
更为保守的设置可能会在每个实例中使用 4 个或更多的 Unicorn 进程,响应每秒大约 5-8 个请求。然后,调整实例数量,直到 CPU 利用率约为 35%。这将确保在紧张的“每秒 20 个请求”场景下保持稳定。
最后,您可以通过使用 God 获得更详细的统计数据和详细信息。

2
  1. OP说这是在负载测试期间发生的,所以这确实是一个流量峰值。
  2. 没有线程进程与核心数量有什么关系?
- Andrew Marshall

1

对于高CPU的超大实例,每秒20个请求非常低。很可能代码存在问题,独角兽特定的问题似乎不太可能。如果您有疑问,可以尝试使用不同的应用服务器并确认它仍然发生。

在这种情况下,我会思考以下问题...

1- 你的代码中是否有一些CPU密集型的操作 - 也许应该将其放在数据库中。例如,如果您正在返回一个大记录集并在ruby / rails中循环遍历以对其进行排序或执行其他操作,那么这将解释为什么在此级别上存在CPU瓶颈而不是在数据库内部。在这种情况下的建议是重新设计查询以做更多的事情,并减轻rails的负担。例如,如果您在控制器中对结果集进行排序,而不是通过sql进行排序,那么就会导致出现此类问题。

2- 是否与普通的crud应用程序相比做了任何不寻常的事情,例如访问共享资源或任何可能引起争用的事情?

3- 您是否有任何可能会烧毁CPU的循环,特别是如果存在对资源的争用?

4 - 尝试解除控制器逻辑中的各个部分。例如,如果您将代码修改为仅返回静态的“Hello World”响应,它的扩展性如何?我敢打赌,突然间独角兽会变得非常快。然后尝试逐步添加代码,直到发现缓慢的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接