【问题标题】:Unicorn CPU usage spiking during load tests, ways to optimize负载测试期间独角兽 CPU 使用率飙升,优化方法
【发布时间】:2012-06-25 02:52:12
【问题描述】:

我对优化我的 Ruby on Rails 3.1.3 应用程序的 Unicorn 设置的方法很感兴趣。我目前在 High-CPU Extra Large Instance 上生成 14 个工作进程,因为我的应用程序在负载测试期间似乎受 CPU 限制。在模拟负载测试中,每秒大约有 20 个请求重播请求,我的实例上的所有 8 个内核都达到峰值,并且盒子负载峰​​值高达 7-8。每个独角兽实例使用大约 56-60% 的 CPU。

我很好奇有什么方法可以优化它?我希望能够每秒将更多请求集中到这种大小的实例上。内存和所有其他 I/O 一样完全正常。在我的测试过程中,CPU 正在下降。

【问题讨论】:

  • 你使用 ruby​​ 1.9 吗?如果没有,那可能会有所帮助。
  • 分析你的代码(ruby-prof)找出它为什么慢,尝试重写瓶颈。重复直到足够快。 0 信息我们无法猜测为什么您的代码没有更快
  • @randombits,如果每个 CPU 内核每秒只能处理约 2 个请求,那么您的应用程序内部的某些东西会严重缓慢。您无需优化 Unicorn 设置。您需要优化您的应用程序代码。您还没有发布任何分析数据——是因为设置和运行分析器似乎很麻烦吗?或者,也许您仍然希望通过调整 Unicorn 配置来解决问题? (不能。)对于初学者,请查看您的 Rails 日志,识别缓慢的请求,并告诉我们它报告的“DB”、“View”和总时间。

标签: ruby-on-rails ruby optimization load unicorn


【解决方案1】:

如果您受 CPU 限制,您希望使用的独角兽进程数量不超过您拥有的内核数量,否则您会超载系统并减慢调度程序。您可以使用 ab 在开发盒上进行测试。您会注意到 2 只独角兽将优于 20 只(数量取决于核心,但这个概念仍然适用)。

此规则的例外是您的 IO 绑定。在这种情况下,添加尽可能多的独角兽。

一个好的性能技巧是将 IO 绑定请求路由到托管许多独角兽的不同应用服务器。例如,如果您有一个使用慢速 sql 查询的请求,或者您正在等待外部请求,例如信用卡交易。如果使用 nginx,为 IO 绑定请求定义一个上游服务器,将这些 url 转发到一个有 40 个独角兽的盒子。 CPU 限制或非常快的请求,转发到一个有 8 个独角兽的盒子(你说你有 8 个内核,但在 aws 上你可能想尝试 4-6 个,因为他们的调度程序是超监控的并且已经很忙了)。

另外,我不确定您是否可以依靠 aws 为您提供可靠的 CPU 使用率,因为您获得的百分比是一个不起眼的百分比。

【讨论】:

    【解决方案2】:

    首先,您可能不希望实例的 CPU 为 45-60%。在这种情况下,如果您遇到流量高峰,您的所有实例都会阻塞。

    接下来,14 个 Unicorn 实例似乎很大。 Unicorn 不使用线程。相反,每个进程都使用单个线程运行。 Unicorn 的主进程只会select 一个线程,如果它能够处理它。因此,内核数量不是衡量 Unicorn 性能的指标。

    更保守的设置可能每个实例使用 4 个左右的 Unicorn 进程,每秒可能响应 5-8 个请求。然后,调整实例数量,直到您的 CPU 使用率达到 35% 左右。这将确保在“每秒 20 个请求”的紧张情况下的稳定性。

    最后,您可以使用God 获得更多的统计数据和详细信息。

    【讨论】:

    • 1) OP 说这是在负载测试期间,所以这流量高峰。 2) 没有线程进程与内核数量有什么关系?
    【解决方案3】:

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

    在这种情况下,我会考虑的问题...

    1 - 你是否在代码中做一些 CPU 密集型的事情——也许真的应该在数据库中。例如,如果您要带回一个大型记录集并在 ruby​​/rails 中循环遍历它以对其进行排序或执行一些其他操作,这将解释此级别的 CPU 瓶颈,而不是数据库中的瓶颈。在这种情况下,建议修改查询以做更多事情并减轻负担。例如,如果您在控制器中对结果集进行排序,而不是通过 sql,则会导致这样的问题。

    2 - 与普通的 crud 应用相比,您是否在做任何不寻常的事情,例如访问共享资源,或任何可能存在争用问题的事情?

    3 - 您是否有任何可能烧毁 CPU 的循环,尤其是在争用资源的情况下?

    4 - 尝试解开有问题的控制器逻辑的各个部分。例如,如果你修改你的代码只返回一个静态的 hello world 响应,它的扩展性如何?我敢打赌,独角兽会突然变得异常快。然后尝试重新添加部分代码,直到发现缓慢的根源。

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      相关资源
      最近更新 更多