-
Notifications
You must be signed in to change notification settings - Fork 0
CostConsiderationsOnHeroku
1アカウントインスタンス https://mastodon.zunda.ninja/ のHerokuでの運用経験から、どのような費用がかかるかまとめてみました。 合計$16.05/月程度となりました。全文検索する場合には、さらに$9/月程度かかりそうです。
2017年6月1日の執筆現在、このインスタンスは
- 1アカウントが登録していて、
- 115アカウントをフォローし、
- 198アカウントからフォローされ、
- 1057ステータスの投稿があり、
- 457インスタンスと接続されていて、
います。
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プランのHeroku Postgresはデータの行数に制限があります。下記のプロットは運用を始めてから1週間ちょっとの間の行数の変化です。これより、しばらくの間はHobby-basicプランでの運用を続けることができそうです。
- 無料のHobby-devプランの制限10,000行を超えたのは1週間弱のことでした
- 現在の行数の増加は1日あたり3,400行程度です。Hobby-basicプランの制限10,000,000行に達するには8年程度かかりそうです
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 |
このアプリケーションにはメールAdd-onをつけましたが、rails mastodon:confirm_email
コマンドを使えばメールの受信は不要でした。
このアプリケーションからPapertrailに送られているアプリケーションログは、これまででは最大16.4 MB/日でした。無料プランの制限は10 MB/日なので、50 MB/日のプラン($7/月)に移行するか、無料プランの制限のゆるいLogentriesに移行するか、記録するログを減らす必要があります。
2017-05-02にsample#
にマッチするログを記録しないようにしてみました。log-runtime-metrics
で得られる各種メトリクスが記録されなくなります。これで無料プランの制限内におさまるといいな。
2017-05-07。やはりPapertrailの容量制限を超えてしまうことがあるようです。Logentriesに移行しよう。
最近の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.