【问题标题】:Understanding why my Rails 4 App is randomly timing out了解为什么我的 Rails 4 应用程序随机超时
【发布时间】:2016-07-13 20:35:15
【问题描述】:

在过去的几个月里,我的网站(使用 Heroku 在 Rails 4 上运行)一直没有问题。流量稳定,响应时间低于 500 毫秒。

今天,随机响应时间飙升至 20,000 毫秒以上。

查看日志时,我注意到 ActiveRecord 运行 SELECT DISTINCT COUNT 的时间异常长。事实上,这似乎是导致加载缓慢的原因。

(5029.1ms)  SELECT DISTINCT COUNT(DISTINCT "impressions"."session_hash") FROM "impressions" WHERE "impressions"."impressionable_id" = $1 AND "impressions"."impressionable_type" = $2  [["impressionable_id", 826], ["impressionable_type", "Article"]]

我想说这是由印象派 gem 和我用来显示文章计数的计数器缓存引起的,但我不确定。

我现在也是第一次在我的日志中看到这个错误:

PG::DuplicatePstatement: ERROR:  prepared statement "a9" already exists

任何帮助了解正在发生的事情都会很棒。似乎无法找到有关该问题的文档。很奇怪,我的应用程序已经稳定运行了几个月,而就在今天它决定走下坡路。

我还在 Heroku 中使用 Rack Timeout gem。我听说这个 gem 可以直接或间接地导致上述错误,但我只是想知道为什么会发生这种情况。如果我可以提供任何其他信息或指标,请告诉我。

一天后更新:

响应时间自行恢复正常(

仅供参考,上面的SELECT DISTINCT COUNT查询是从我的文章显示页面中的这段代码执行的,它只是计算会话的唯一展示次数:

<%= @article.impressionist_count(filter: :session_hash) %>

【问题讨论】:

  • 您使用 Heroku 的付费版还是免费版?
  • 付费...在标准 2X Dyno 和 Hobby Basic DB(10m 行)@CheeseFry 上运行
  • 您能发布生成该查询的 Ruby 代码吗?

标签: sql ruby-on-rails ruby ruby-on-rails-4 heroku


【解决方案1】:

发生此错误PG::DuplicatePstatement: ERROR: prepared statement "a9" already exists 是因为您启用了准备好的语句。我不知道这个错误的确切原因是什么。我在测试构建期间和其他一些地方随机看到它。我通常建议您禁用准备好的语句,因为它可以为您节省一些真正的麻烦。当您获得更多流量并尝试扩展您的测功机时,您可以开始从 pg gem 中看到内存不足错误。

要禁用,只需将其添加到您的 database.yml

production:
    adapter: postgresql
    prepared_statements: false

您也可以在其他环境中禁用它。

回到最初的问题,通常COUNT 查询在 Postgres 中很慢,尤其是在 DISTINCT 中,所以你应该尝试优化它。但由于它是随机峰值,我敢打赌它是由AUTOVACUUM 引起的。如果您不熟悉,AUTOVACUUM 就像一个垃圾收集器,可以从磁盘中删除已删除的行,收集统计信息等。运行时它会产生大量 IO 流量,从而减慢其他查询的速度。默认情况下,它会在表中 20% 的行发生更改后调用,您无法准确预测它何时会发生。可以在夜间或仅在低流量期间手动运行它。只需在 psql 中输入VACUUM ANALYZE table_name;

您还可以查看与 autovacuum 相关的数据库统计信息(上次执行时间、更改的行数等)。最简单的方法是安装https://github.com/heroku/heroku-pg-extras并运行heroku pg:vacuum-stats

【讨论】:

    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多