0

Rails 3.2.x と Thin 1.5.0 を使用していますが、最初にアプリをロードするとき、たとえば 24 時間ロードしないと、非常に時間がかかります。最初は、それは私の MacBook だけだと思っていました。なぜなら、それはスリープ モードになっていて、なんらかの理由で最初は永遠にかかっていたからです。

しかし、Heroku でも同じことができ、他の人でも同じことができることに気付きました。しばらく Heroku サイトにアクセスしていないときのように、最初の読み込み (毎回ではなく、数回) には永遠に時間がかかります。

ログによると、私のスタイルシートのコンパイルには時間がかかるようです。私が混乱しているのは、Herokuにプッシュすると、プッシュ中にアセットをコンパイルする必要があるということです...そうですか? したがって、理論的には、それが本番環境での速度低下の原因であってはなりません。または、何か不足していますか?

ただし、最近、Heroku はプッシュを拒否しているため、これを有効にする必要がありました。

# Don't initialize app on pre-compile
  config.assets.initialize_on_precompile = false

したがって、それが貢献しているかどうかはわかりません。

Started GET "/" for 127.0.0.1 at 2013-02-19 02:44:14 -0500
Processing by HomeController#index as HTML
  Category Load (56.6ms)  SELECT "categories".* FROM "categories" LIMIT 6
  EXPLAIN (14.6ms)  EXPLAIN QUERY PLAN SELECT "categories".* FROM "categories" LIMIT 6
EXPLAIN for: SELECT  "categories".* FROM "categories"  LIMIT 6
0|0|0|SCAN TABLE categories (~1000000 rows)

  Banner Load (44.4ms)  SELECT "banners".* FROM "banners" INNER JOIN "banner_types" ON "banner_types"."id" = "banners"."banner_type_id" WHERE (banner_types.name = 'Featured')
  Banner Load (0.3ms)  SELECT "banners".* FROM "banners" INNER JOIN "banner_types" ON "banner_types"."id" = "banners"."banner_type_id" WHERE (banner_types.name = 'Side')
  Product Load (3.4ms)  SELECT "products".* FROM "products" 
  Vendor Load (15.9ms)  SELECT "vendors".* FROM "vendors" 
  User Load (50.0ms)  SELECT "users".* FROM "users" 
  EXPLAIN (0.1ms)  EXPLAIN QUERY PLAN SELECT "users".* FROM "users" 
EXPLAIN for: SELECT "users".* FROM "users" 
0|0|0|SCAN TABLE users (~1000000 rows)

  Vendor Load (0.3ms)  SELECT "vendors".* FROM "vendors" WHERE "vendors"."id" = 12 LIMIT 1
  Vendor Load (0.2ms)  SELECT "vendors".* FROM "vendors" WHERE "vendors"."id" = 11 LIMIT 1
  Vendor Load (0.2ms)  SELECT "vendors".* FROM "vendors" WHERE "vendors"."id" = 10 LIMIT 1
  CACHE (0.0ms)  SELECT "vendors".* FROM "vendors" WHERE "vendors"."id" = 12 LIMIT 1
  CACHE (0.0ms)  SELECT "vendors".* FROM "vendors" WHERE "vendors"."id" = 12 LIMIT 1
  CACHE (0.0ms)  SELECT "vendors".* FROM "vendors" WHERE "vendors"."id" = 10 LIMIT 1
  Rendered home/_popular_products.html.erb (303.0ms)
  Rendered home/_popular_stores.html.erb (2.4ms)
  Rendered home/index.html.erb within layouts/application (570.6ms)
Compiled main.css  (20360ms)  (pid 86898)
Compiled application.css  (2366ms)  (pid 86898)
  Rendered layouts/_login_nav.html.erb (1.0ms)
  Rendered layouts/_navigation.html.erb (1.7ms)
  Rendered layouts/_header.html.erb (47.3ms)
  Rendered layouts/_messages.html.erb (0.2ms)
  Rendered layouts/_footer.html.erb (0.5ms)
Completed 200 OK in 38402ms (Views: 30707.1ms | ActiveRecord: 1830.8ms)

考え?

編集1:

この質問は十分に回答されていないことに注意してください。回答は両方とも、質問の一部であるHerokuの問題について語っています。ただし、開発中に発生するこの問題に対処することはできません。

4

2 に答える 2

2

一定時間アクセスがない場合、Heroku はアプリをスピンダウンしてリソースを節約します。したがって、アプリ全体を再度起動する必要があるため、速度が低下します。

詳細については、 https: //devcenter.heroku.com/articles/dynos のDyno Idling を参照してください。

これを回避するには、アプリケーションに頻繁に ping を送信する New Relic アドオンなどのサービスを使用して、スピン ダウンを停止します。

また、オンデマンドではなく、展開時にアセットをコンパイルする必要があります。Heroku はデフォルトでこれを行う必要があります。それを防ぐために何を変更しましたか?

于 2013-02-19T08:02:03.903 に答える
1

Heroku に dyno が 1 つしかない場合 (無料プラン)、リソースを節約するためにしばらくするとアイドル状態になります。その後、しばらくして誰かがあなたのアプリにアクセスすると、アプリは再び起動します。

そのため、アプリに最初にアクセスする人はしばらく待たなければなりません。

于 2013-02-19T08:02:46.017 に答える