-
Notifications
You must be signed in to change notification settings - Fork 0
CostConsiderationsOnHeroku
2022年11月のHerokuの無料プランの停止に伴ってこのページの情報は古くなりました。2023年1月をめどに更新します。
1アカウントインスタンス https://mastodon.zunda.ninja/ のHerokuでの運用経験から、どのような費用がかかるかまとめてみました。 合計$60/月程度となりました。全文検索する場合には、さらに$9/月程度かかりそうです。
2017年4月15日から運用を始めました。
2017年6月1日の執筆現在、このインスタンスは
- 1アカウントが登録していて、
- 115アカウントをフォローし、
- 198アカウントからフォローされ、
- 1057ステータスの投稿があり、
- 457インスタンスと接続されていて、
います。2019年2月15日には、
- 389アカウントをフォローし、
- 540アカウントからフォローされ、
- 21010ステータスの投稿をする
まで成長しました。
Mastodonはweb (Puma)、worker (Sidekiq)それぞれ1 dynoを割り当てるようにコードが書かれています。Herokuでは、CPU負荷よりもメモリが主な制限になっているようです。Pumaのプロセスあたりのスレッド数を5から3にすることで、PumaとSidekiqをメモリ512MBのdyno 1台に詰め込むことができました。
Web dynoは、デフォルトの2プロセス×5スレッドでは、total memoryの使用量は最大320 MB程度でした。下記のコマンドでプロセスあたりのスレッド数を3にすると、290 MB程度になりました。
heroku config:set MAX_THREADS=3
Worker dynoのメモリ使用量は230 MB程度でした。
というわけで、
heroku ps:scale web=1 worker=0
して、下記のようなProcfileで1 dynoに詰めて運用しています。
web: puma -C config/puma.rb & sidekiq & wait -n
release: rake db:migrate
2018年2月21日ごろから使用メモリ量が少し増えたようです。トラフィックの変化がないのにCPU負荷が増えていたので、スレッド数をすこし下げてみました。
なお、release:
の行を書いておくとデプロイのたびに実行してくれます。
有料のDynoにはSSL証明書がついてきます。ドメイン自体の費用はこの記事には含めていません。
Stream API用のDynoはタイムラインを眺めている時のみ必要なので、Free dynoでオートスケールもどきしてみます。
- 無料の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/月)に移行しました。
Hobby DevプランのHeroku Redisには同時接続数が20以内という制限があります(Heroku PostgresのHobbyプランでも同様です)。Puma、Sidekiq、npmをデフォルトのプロセス・スレッド数で稼働させると若干足りないので、Sidekiqのスレッド数をデフォルトより減らしてあります。
これも含めてconfig varは下記のようにしてあります。
項目 | 設定ファイル | config var | 内容 |
---|---|---|---|
Puma worker(プロセス)数 | config/puma.rb |
WEB_CONCURRENCY |
1 |
Puma スレッド数 | config/puma.rb |
MAX_THREADS |
2 |
Pumaからのデータベース接続数 | config/database.yml |
DB_POOL |
6 |
Sidekiq スレッド数 |
Procfile でsidekiq -c ${SIDEKIQ_THREADS:-5}
|
SIDEKIQ_THREADS |
2 |
npm worker数 | streaming/index.js |
STREAMING_CLUSTER_NUM |
3 |
2017年5、9月分は下記のような使用量となりました。 無料期間の過ぎた2018年6月分では下記のようになりました。
項目 | 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 |
リモートからキャッシュしているメディアの古いものを消すことで保管費用を節約できます。Advanced Schedulerで毎週tootctl media remove
を実行しています。無料プランでは合計100回まで実行してもらえそうです。

このアプリケーションにはメールAdd-onをつけましたが、rails mastodon:confirm_email
コマンドを使えばメールの受信は不要でした。
新しいトレンドや、レポートを受け取る場合には、メールAdd-onをつけておくのが良さそうです。
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
最近のMastodonではElasticsearchで全文検索が可能です。Searchbox Elasticsearchを利用すると$9/月程度で運用できそうです。
Contents in this wiki is copyright 2017 by zunda and licensed under a Creative Commons Attribution 4.0 International License.