2016-02-18 27 views
8

ben Puma üzerinde çalışan, Heroku bir uygulamanız olabilir:Çok yavaş: ActiveRecord :: QueryCache # çağrı

workers 2 
threads_count 3 
pool 5 

bazı talepler katman sıkışıp gibi görünüyor ve bu uygulama çok yavaş yapar (ÇOK !). Bu problemle ilgili diğer insan konularını görmüştüm ama şu ana kadar çözüm yok.

Herhangi bir ipucunuz varsa lütfen bana bildirin.

aactiverecord_querycache_1 !

aactiverecord_querycache_2 !

+0

kendime yanıt: Nadiren talep edilmiş olsa bile, en yavaş veritabanı sorgularını kontrol edin, etkilerinin geri kalanı sorgunun geri kalanında çok büyük. – user3029400

+0

Hangi önbellek deposunu kullanıyorsunuz?Hata ayıklamanın ilk sebebi, mağazanın yanıt vermek için ne kadar uzun sürdüğü ya da (önbellek deposu dosya tabanlıysa), önbellek deposundaki verilerin seri hale getirilmesinin çok uzun sürmesi olabilir mi? – jbielick

cevap

2

Kendi sorumu cevaplayacağım: Sadece tüm sorgularımı DB'mde kontrol etmeliyim. Bunlardan biri çok uzun bir süre alıyordu ve sık sık talep edilmemiş olsa bile, daha sonra tüm sunucuyu yavaşlatıyordu (süreç bittikten sonra bile "trafik sıkışıklığı" vardı. sunucu). Çözüm: Veritabanınızdaki tüm sorguları kontrol edin, en yavaş olanları düzeltin (sadece birkaç adımda kırmak anlamına gelebilir, trafik olmadığı zamanlarda geceleri çalışmasını sağlayabilir, vb.). Bu sorgular düzeltildikten sonra, her şey normale dönmelidir.

1

Kısa bir süre önce ActiveRecord :: QueryCache # çağrısı için harcanan zaman içinde bir artış görmeye başladım. Kaynağa baktıktan sonra, üretim ortamına bağlı bir Rails Konsolundan ActiveRecord::Base.connection.clear_query_cache kullanarak söz konusu önbelleği temizlemeyi denedim. Geri döndüğüm hata Heroku Rails could not fork new process for connection: Cannot allocate memory

+0

Bu soruya nasıl cevap veriyor? –

+3

OP ile aynı tecrübeye sahip olmak ve daha fazla araştırma yaptıktan sonra, soruyu tamamen cevapsız bırakmak yerine, birisine yardımcı olabileceğini umarak, bulduğum şeyi paylaştım. – rjspotter

4

Bana bu diğer SO sorusuna yön veren PG::ConnectionBad: could not fork new process for connection: Cannot allocate memory oldu. Ben Heroku desteği için çalışıyorum ve Middleware/Rack/ActiveRecord::QueryCache#call, New Relic tarafından sıkça sorulan bir sorundur. Ne yazık ki, sorunun kaynağı her zaman başka yerlerde olduğu için genellikle kırmızı bir ringa balığı.

QueryCache, Rails ilk önce bir bağlantıyı kullanıma sunmaya çalışır, bu nedenle bağlantıyla ilgili herhangi bir sorun, 'beklemede' bekleyen bir istek olarak burada görünür. Bu, veritabanı sunucusunun bağlantıların dışında olduğu anlamına gelmez (Postgres için Librato grafikleri varsa bunu gösterir). Büyük olasılıkla, bir şeyin kötü bir duruma girmesi için belirli veritabanı bağlantılarına neden olduğu ve yeni bağlantı isteklerinin beklendiği anlamına gelir. Bu, birden çok iş parçacığının kullanıldığı Puma'nın eski sürümlerinde ve reaping_frequency öğesinin ayarlandığı durumlarda oluşabilir - bazı bağlantılar kötü duruma geçerse ve diğerlerine yanıt verilirse bu sorunlara neden olur. aşağıdaki gibi

Bazı üst düzey önerileri

şunlardır:

  • Yükseltme Yakut & Puma
  • rack-timeout mücevher kullanılıyorsa, çok

Bu güncellemeler genellikle yardımcı olduğunu yükseltin. Aksi takdirde, iş parçacıklarından çalışan tabanlı işlemlere geçiş veya PgBouncer gibi bir Postgres bağlantı havuzu kullanma gibi başka seçenekler de vardır. Postgres ile kullanmak için eşzamanlı web sunucularını yapılandırma hakkında daha fazla öneri sunuyoruz: https://devcenter.heroku.com/articles/concurrency-and-database-connections