-
Notifications
You must be signed in to change notification settings - Fork 0
CostConsiderationsOnHeroku
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 | - |
このインスタンスでは、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
-
無料の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/月)を利用しています。
プロダクション用の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 スレッド数 |
Procfile でsidekiq -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倍 |
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 |
リモートのメディアやアーカイブの古いものを消すことで保管費用を節約できます。
このアプリケーションにはメール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/月程度で運用できそうです。2023年1月現在は利用していません。
Contents in this wiki is copyright 2017 by zunda and licensed under a Creative Commons Attribution 4.0 International License.