繁体   English   中英

Ruby on Rails 应用程序的 Heroku 配置

[英]Heroku configuration for Ruby on Rails application

我使用 Heroku 为他们的 Ruby on Rails 应用程序设置了一个客户端,多年来遇到了很多麻烦,他们的应用程序运行不佳,无论我们在额外资源上花了多少钱,发现他们的文档非常混乱。 我一直无法理解他们的特定术语和文档。 我们不断收到“H12”错误和“R14”错误等。内存使用量和动态负载不断增加。 然而,这是一家没有大量流量的中小型企业。 想知道是否有人了解 Heroku 的来龙去脉,可以查看此配置并告诉我它是否有意义:

DB_POOL: 10
MALLOC_ARENA_MAX: 2
RAILS_MAX_THREADS: 5
WEB_CONCURRENCY: 4
Ruby 2.7
Rails 6.0
Puma
8 2x web dynos
5 1x worker dynos
$50 Postgres standard 0 database
$15 Memcachier
$10 Rediscloud
...etc addons

您的WEB_CONCURRENCY对您的 Standard-2x WEB_CONCURRENCY来说太高了。 推荐的默认值为 2: https : //devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#recommended-default-puma-process-and-thread-configuration

这可能会导致您的 R14 错误,因为更高的 Web 并发意味着更多的内存使用。 因此,您需要降低 Web 并发性(这可能意味着您还需要增加 dynos 的数量以进行补偿),或者您需要使用更大的 dynos。

您已经有MALLOC_ARENA_MAX=2但不确定您是否正在使用jemalloc 您可能也想尝试一下

当然,您的应用程序中可能还有其他内存问题 - 请在此处查看一些提示。 我还建议添加一个像AppSignal这样的监控工具,因为它能够跟踪每个事务的内存分配

为了减轻 H12:

  1. 确保你已经安装了类似rack-timeout gem 的东西,它确保长时间运行的请求在 dyno 级别被丢弃,从而避免 H12 错误(你会得到一个Rack::TimeoutError异常)。 将超时设置为 15 秒,使其远低于 H12 超时的 30 秒。
  2. 调查您的缓慢交易。 监控工具是这里的关键,即New Relic (从价格最低的付费计划开始 - 免费计划不允许交易跟踪)。 这是他们关于 如何跟踪交易的博客文章
  3. 当您确定问题时 - 修复它!
  • 如果瓶颈是外部的:
    • 检查外部 API 限制和限制
    • 添加超时并使应用程序能够适应缓慢的外部响应
  • 如果瓶颈是由于数据库造成的:
    • 优化慢查询
    • 检查缓存命中率
    • 检查等待连接数和数据库锁-> 如果等待连接数在 X 分钟内始终高于 0,则表明您有一些需要调查的长锁。 随着时间的推移,使用Librato最容易跟踪等待连接(免费计划应该没问题)
  • 如果瓶颈是其他应用程序代码:
    • 添加更多自定义仪器以获得更多见解,即新遗物说明
    • 解决应用代码问题

我想强调监控工具在帮助诊断问题和帮助确定最佳资源使用方面的重要性。 如果没有适当的监控工具,几乎不可能确定正确的并发配置、正确的大小和要运行的 dynos 数量。 希望您的etc add-ons已经涵盖了一些未列出的内容,但如果您没有,我将总结我的建议并提及一些其他提示:

  • 要获取更多指标信息,请确保您已启用log-runtime-metrics
  • 还启用Ruby 语言指标
  • 添加一个可以跟踪 Ruby 内存分配的监控工具,如AppSignal Scout APM也可以做到这一点,但我认为他们的计划能够做到这一点更昂贵(需要 Scout Insights 功能)
  • 添加最低付费版本的New Relic 这是我用于事务跟踪的首选工具。 如果您不想为其他工具付费,AppSignal 也可以这样做,但我发现使用 New Relic 更容易。
  • 添加天秤座 它提供了一些开箱即用的出色图表,包括在其自己的仪表板中的一组 Postgres 图表。
  • 在您的监控应用程序中设置警报以警告您有关响应时间之类的事情,以便您可以查看它们!
  • 当然,首先在暂存中进行所有更改并对其进行 负载测试,以查看更改的影响,然后再尝试投入生产!

更新:我也刚刚注意到您说您使用的是 Standard-0 Postgres,这意味着它有120 个连接限制 因此,如果您最终降低了WEB_CONCURRENCY并增加了WEB_CONCURRENCY数量,请注意与该数据库的总连接数。 除了存在限制这一事实之外,更多的连接也意味着更多的数据库开销,因此如果您接近连接限制,您更有可能看到数据库性能受到影响。 您可能希望升级到另一个具有更高连接限制的计划或使用pgbouncer作为您的连接池以避免连接限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM