Heroku でホストされているベータ前の Rails 3.2 アプリのパフォーマンスを改善しようとしています。
アグレッシブ キャッシングによって状況は劇的に改善されましたが、New Relic でのアプリ サーバーの応答時間 (グラフの水色) を見ると、「Ruby で費やされた時間」が依然として大きく寄与していることに気付きます。
Rails アプリのどの部分が、通常、この「Ruby 時間」に貢献していますか?
これは、メイン コントローラーの 1 つの複雑な条件が原因であると当初考えていましたが、単純化しました。私のビューは現在、ロシアンドールのフラグメントキャッシュと memcache を使用して非常に積極的にキャッシュされています (すごい!)。
静的アセットの提供が原因でしょうか? (S3 への移行 / CloudFont は todo リストにあります...)
ありがとう!
(私はすでにdelayed_jobのセットアップを行っており、できる限りすべてをバックグラウンドに移動しました。WebサーバーとしてUnicornも使用しています。)
更新されたパフォーマンス調整
積極的なキャッシングの後、アプリのパフォーマンスを向上させる他の方法を探し始めました。
最初にガベージ コレクションの監視を提案として追加しましたが、GC が Ruby の時間に大きく影響していないことがわかりました。
次に、CDN (CDNsumo アドオンを介した Cloudfront) を追加して、アセットの提供を開始することにしました。興味深いことに、これにより NR モニタリングでの Ruby の時間が実際に短縮されました。(CDN はプロビジョニングされ、下のグラフの右端にある最後のリクエスト テストによってウォームアップされました。) 私のページのほとんどには、数百キロバイトの CSS と JavaScript があります。
最後に、'Basic' スターター データベースから最小の実稼働データベース 'Crane' にアップグレードしました。これは、パフォーマンスに劇的な影響を与えました。PG による少しのキャッシュの後、アプリは動作します。(下のグラフの最後の 3 つの要求スパイク)。
Heroku アプリの調整を試みている他のユーザーへのメッセージ:
- 複数の領域 (キャッシング、CDN、データベース、Ruby コードなど) での単純なパフォーマンス チューニングは、スタック全体で相乗効果をもたらします。
- 逆に、1 つのパフォーマンスの低下は、他の領域を調整しても克服できないボトルネックになります (つまり、Heroku の遅いスターターの Basic または Dev データベースと「高価な」本番データベース - 遅い Basic データベースがアプリのパフォーマンスを犠牲にしていました) )。
- NewRelic は、どこで最大の利益を得ることができるかを判断する上で不可欠です。