Herokuでアプリを本番稼働させる上で、「Dynoタイプをどうするか」「台数をどうするか」については一番最初に悩むポイントかと思います。
恥ずかしながら私自身も、アプリ稼働当初は何となくの感覚でDynoタイプ、台数を決めていました。それにより根拠無くオーバースペックな構成にしてしまい、無駄な維持費を掛けてしまっていたことがあります。
今回の記事では定量的にDynoタイプと台数を選定する方法についてまとめてました。同様のことでお悩みの方の参考になれば幸いです。
全てはMetricsタブから
Heroku管理画面のMetricsタブを見ることである適切なDynoを検討することが可能です。 主に見る項目は「Memory Usage」「Response Time」「Throughput」「Dyno Load」の4つです。
Memory UsageとDyno loadはDynoタイプの選定に有効
Memory UsageとDyno loadにより、適切なDynoタイプを判断することができます。もちろんDynoの台数を増やすことの判断材料としても有効ですので積極的に値を確認しましょう。
Memory Usage
Memory UsageではDynoのメモリ使用量を把握することができます。
主に見るのは「MEM QUOTA」「MAX RSS」です。 MEM QUOTAはDynoが許容できるメモリ使用量です。MAX RSSは実際に使用しているメモリ使用量です。 MAX RSSがMEM QUOTAを超えると基本的にNGです。
超えてしまうとスワップメモリが頻繁に発生するようになります。スワップメモリが発生するとレスポンス速度が著しく低下してしまいユーザ体験の低下に繋がります。
MAX RSSがMAX QUATAを超えないようにDynoタイプもしくはDynoの台数を調整する必要があります。
一概には言えませんが、個人的な経験則ではDynoの台数を増やすよりもDynoタイプをアップグレードするほうが効果的であると感じます。
より詳細にアプリケーションレベルで原因を追求したい場合はScoutAPM等のアドオンを入れる必要があります。 詳しくは下記記事をご参照ください。
HerokuのR14エラーをScoutAPMで対策する方法 | Rails - 行動すれば次の現実
また、Herokuの設定等によってもメモリ消費量を抑えることができます。詳しくは下記記事を参考にしてチューニングすると良いでしょう。
R14 - Memory Quota Exceeded in Ruby (MRI) | Heroku Dev Center
Dyno load
Dyno loadとは直訳すると「Dynoの負荷」という意味で、Dynoに対してどのくらいのCPU負荷がかかっているのかを測定した結果が表示されます。
HerokuではDynoタイプごとに負荷の許容値が設定されています。
free: 1 hobby: 1 standard-1x: 1 standard-2x: 1 performance-m: 2 performance-l: 8
Performance Dyno以外は1が設定されています。1を超えるとCPUの許容を超えたことを意味します。
許容を超えるとCPUが占領されていることになりますので、待ち時間が発生してしまいます。
一時的に許容値を超える分には大きな問題はないと思いますが、なるべく許容値を下回るように考慮しておくほうが望ましいです。
1を超えるようであれば台数を増やしてみる、またはDynoタイプを上げてみて数値の変動を監視すると良いでしょう。 ちなみにすでに複数Dynoを並行稼動使用している場合は、稼働しているDynoの平均値が計算されて評価されるようです。
ThroughputとResponse TimeはDynoの台数を増やすかどうかの指標
ThroughputとResponse Timeの結果によりDynoの台数が適切であるかどうかの判断ができます。
※この2つの指標はwebプロセスのみ有効な指標です。workerプロセスでは表示されません。
Throughput
Throughputではrpsという単位(1秒あたりに捌いているリクエスト数)でグラフ化しています。 rpsが大きい時間帯がアクセスのピークを示しています。
例えば下記の図のようなグラフであればPM3時あたりとPM6時あたりがピークであることが把握できます。
Response Time
Response Timeでは時間帯ごとのレスポンス時間がグラフで確認できます。 Response Timeの数値が高い時間帯のThroughputのrpsを確認すると、ある程度の相関関係があることが確認できるかと思います。
rpsとResponse Timeの両方が高い場合、Dynoが捌ききれるキャパシティを超えている可能性があります。 レスポンス時間がサービスの許容している時間を超えてしまっている状況が続くと、ユーザー体験の低下に繋がります。そのため、ピーク時間に合わせてDynoの台数を増やすなどの対策をすることでレスポンス時間の削減を図ることができます。
参考
https://help.heroku.com/88G3XLA6/what-is-an-acceptable-amount-of-dyno-load https://devcenter.heroku.com/articles/dyno-types https://devcenter.heroku.com/articles/ruby-memory-use#detecting-a-problem