我在heroku上有一个应用程序,在Puma上运行:
workers 2
threads_count 3
pool 5
看起来有些请求卡在中间件中,它使应用程序非常慢(非常!)。 到目前为止,我已经看到其他人对这个问题有所了解但没有解决方案。
如果您有任何提示,请告诉我。
!
!
答案 0 :(得分:7)
我为Heroku支持工作,array.each { |a, b| hash[a] += b }
#=> {172=>3, 173=>1, 174=>6}
是New Relic常见的问题。不幸的是,每当问题的根源出现在其他地方时,它通常都是红鲱鱼。
Middleware/Rack/ActiveRecord::QueryCache#call
是Rails首先尝试检查连接以供使用的地方,因此连接的任何问题都将在此处显示为请求“卡住”等待。这并不意味着数据库服务器必然没有连接(如果你有Postgres的Librato图表,他们会显示这个)。这可能意味着某些事情导致某些数据库连接进入错误状态,并且新的连接请求正在等待。这可能发生在Puma的旧版本中,其中使用了多个线程并且QueryCache
已设置 - 如果某些连接进入错误状态而其他连接被收到,则会导致问题。
一些高级别的建议如下:
reaping_frequency
gem,请升级这些升级通常会有所帮助。如果没有,还有其他选项可供选择,例如从线程切换到基于工作程序的进程或使用Postgres连接池(如PgBouncer)。我们在此处提供了有关配置与Postgres一起使用的并发Web服务器的更多建议:https://devcenter.heroku.com/articles/concurrency-and-database-connections
答案 1 :(得分:4)
我会回答我自己的问题: 我只需要检查所有查询到我的数据库。其中一个是花了很长时间,即使它没有经常被要求,它也会在整个服务器上放慢一段时间(即使在完成这个过程之后,也会出现一种“交通拥堵”。服务器)。 解: 检查所有对数据库的查询,修复最慢的查询(可能只是意味着在几步中将其分解,这可能意味着在没有流量的情况下让它在晚上运行等等)。 修复此查询后,一切都应恢复正常。
答案 2 :(得分:1)
我最近开始看到在ActiveRecord :: QueryCache#call中花费了大量时间。在查看源代码之后,我决定尝试使用附加到生产环境的Rails控制台中的ActiveRecord::Base.connection.clear_query_cache
清除所述缓存。我收到的错误是PG::ConnectionBad: could not fork new process for connection: Cannot allocate memory
,这导致我至少Heroku Rails could not fork new process for connection: Cannot allocate memory