Skip to content

CostConsiderationsOnHeroku

zunda edited this page Feb 6, 2023 · 53 revisions

1アカウントインスタンス https://mastodon.zunda.ninja/ のHerokuでの運用経験から、どのような費用がかかるかまとめてみました。2022年11月のHerokuの無料プランの停止の2023年1月には、ステージング用アプリのリソースを含めて税別合計$87/月程度となりました。全文検索する場合には、さらに$9/月程度かかりそうです。

2017年4月15日から運用を始めました。下記のような成長過程を辿っています。

時期 フォロイー フォロワー 投稿数 連合数
2017年6月1日 115 198 1057 457
2019年2月15日 389 540 21010 -
2023年2月6日 740 1.3K 107K -

Dyno: $12/月

このインスタンスでは、PumaでHTTPSのリクエストを受けるHerokuアプリケーションと、Node.jsでWebSocketのリクエストを受けるHerokuアプリケーションの2つのアプリケーションで運用しています。Pumaのアプリケーションでは常時稼働とカスタムドメインでのTLS接続のため、Basic Dyno ($7/月)を利用しています。Node.jsのアプリケーションはデフォルトドメイン(*.herokuapp.com)でTLS接続を受けることができるため、Eco Dyno (Herokuアカウントの合計で$5/月で1000時間/月まで稼働可能)を利用しています。

SSL証明書はBasic Dyno以上で利用できるAutomated Certificate Managementを利用しています。レジストラに支払っているドメイン費用はこの記事には含めません。

デプロイ時の動作試験のためのPuma用とNode.js用の2つのアプリケーションもEco Dynoを利用して、必要な時のみ稼働させています。デプロイ時のデータベースマイグレーションのためのrelease dynoにもEco Dynoを利用しています。2023年1月には合計748時間ほどのEco Dyno時間を消費しました。

Puma用のHerokuアプリケーションのweb dynoではSidekiqも1スレッド走らせています。下記のようなProcfileでいずれかのコマンドが終了した場合に他方のコマンドもgraceful shutdownするようにしてあります。release行で、デプロイ時にデータベースのマイグレーションとキャッシュの消去をしています。

web: trap '' SIGTERM; BIND=0.0.0.0 puma -C config/puma.rb & sleep 25; sidekiq -c ${SIDEKIQ_THREADS:-5} & wait -n; kill -SIGTERM -$$; wait
release: rake db:migrate && rails runner Rails.cache.clear

Heroku Postgres: $55/月

  • 無料のHobby-devプランの制限10,000行を超えたのは1週間弱のことでした

  • 現在の行数の増加は1日あたり3,400行程度です。Hobby-basicプラン($9/月)の制限10,000,000行に達するには8年程度かかりそうです

  • 2019年2月15日に10,000,000行に到達しました。8年とか書いたの誰だよw Standard-0プラン ($50/月)に移行しました

  • ステージング用にはMiniプランのHeroku Postgres ($5/月)を利用しています。

Heroku Redis: $12/月

プロダクション用の2つのHerokuアプリケーションでは、一般用の他、キャッシュ用とSidekiq用を含めて3つのMiniプランのHeroku Redis (3×$3/月)を利用しています。ステージング用には1つのMiniプランのHeroku Redis ($3/月)を利用しています。

それそれのプロセスのスレッド数

Puma用アプリとNode.js用アプリのそれぞれのweb dynoでSidekiqも走らせています。Node.js用アプリのSidekiqではscheduleキューは走らせていません。2つのアプリのconfig varは下記のようになっています。

項目 設定ファイル config var Pumaアプリ Node.jsアプリ
Puma worker(プロセス)数 config/puma.rb WEB_CONCURRENCY 1 -
Puma スレッド数 config/puma.rb MAX_THREADS 3 -
Pumaからのデータベース接続数 config/database.yml DB_POOL 4 -
Sidekiq スレッド数 Procfilesidekiq -c ${SIDEKIQ_THREADS:-5} SIDEKIQ_THREADS 1 7
npm worker数 streaming/index.js STREAMING_CLUSTER_NUM - 3

Rubyを3.2に上げてからときおりPumaの動作速度が落ちる現象が見られました。下記のようなconfig varを追加してfull GCを抑制したところ解消しました。デフォルト値はRubyのソースコードのうちgc.cに定義されています。

config var Pumaアプリ デフォルト値の
RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR 4.0 2倍
RUBY_GC_OLDMALLOC_LIMIT 67108864 4倍

Amazon S3: $0.22 (無料期間内) $1.56 (無料期間後)

2017年5、9月分は下記のような使用量となりました。 無料期間の過ぎた2018年6月分では下記のようになりました。リモートメディアのキャッシュの消去に加えてユーザーアーカイブの消去も始めた2023年1月分には$1.35となりました。

項目 2017年5月分使用量 料金 2017年9月分使用量 料金 2018年6月分使用量 料金
Data transfer --- --- --- --- ---
AWS USE1-APN1-AWS-Out-Bytes 0 0 0.081 GB $0.00 0.028 GB to Tokyo $0.01
AWS USE1-APS1-AWS-Out-Bytes 0 0 0.000009 GB $0.00 0 0
AWS USE1-CAN1-AWS-Out-Bytes 0.000181 GB $0.01 0.001 GB $0.00 0.001 GB $0.01
AWS USE1-EUC1-AWS-Out-Bytes 0.000241 GB $0.00 0.000001 GB $0.00 0 0
AWS USE1-EU-AWS-Out-Bytes 0 0 0 0 0.000132 GB to Ireland $0.01
AWS USE1-USE2-AWS-Out-Bytes 0 0 0.000285 GB $0.00 0.000350 GB to Ohio $0.01
AWS USE1-USW2-AWS-Out-Bytes 0.021 GB $0.00 0.015 GB $0.00 0.007 GB to Oregon $0.01
Bandwidth in per month 0.0000003 GB $0.00 0.000003 GB $0.00 0.000309 GB $0.00
Bandwidth out under the monthly global free tier 1.087 GB $0.00 2.341 GB $0.00 0 0
Bandwidth out first 1GB per month 0 0 0 0 1 GB 0
Bandwidth out beyond global free tier 0 0 0 0 0.364 GB $0.03
S3 Requests --- --- --- --- --- ---
$0.00/req PUT, COPY, POST, or LIST 2,000 $0.00 2,000 $0.00 0 0
$0.005/req PUT, COPY, POST, or LIST 8,832 $0.04 23,354 $0.12 40,232 $0.20
$0.00/req GET 11,486 $0.00 20,000 $0.00 0 0
$0.004/10,000 req GET 0 $0.00 53,752 $0.02 26,057 $0.01
$0.000/GB 1.185 GB-Mo $0.00 5GB-Mo $0.00 0 0
$0.023/GB first 50TB/month 0 $0.00 3.5682 GB-Mo $0.08 55.228 GB-Mo $1.27
合計 --- $0.05 --- $0.22 --- $1.56

リモートのメディアやアーカイブの古いものを消すことで保管費用を節約できます。

Screen Shot 2023-02-06 at 05 36 48

メール: 不要

このアプリケーションにはメールAdd-onをつけましたが、rails mastodon:confirm_emailコマンドを使えばメールの受信は不要でした。

新しいトレンドや、レポートを受け取る場合には、メールAdd-onをつけておくのが良さそうです。

アプリケーションログ: $8/月

2022年11月現在、Papertrailに下記のフィルターを設定して容量を65 MB以内に抑えています。

  • Regex: pid=[0-9]+ tid=[a-z0-9]+ .*INFO:
  • String: "context":"Job raised exception"
  • String: Process running mem=
  • String: Error R14 (Memory quota exceeded)
  • String: X-Accel-Mapping header missing

全文検索: $9/月

最近のMastodonではElasticsearchで全文検索が可能です。Searchbox Elasticsearchを利用すると$9/月程度で運用できそうです。2023年1月現在は利用していません。