読者です 読者をやめる 読者になる 読者になる

Mastodonを2週間ほどHeroku運用した日報まとめ

https://top-techdrive-mastodon-assets.s3-ap-northeast-1.amazonaws.com/media_attachments/files/000/002/757/original/f13ba52f77560603.png?1493429954

はじめに

流行りそうって言うより、面白そうだったのでやり始めたら結構続けているのでまとめてみます。Herokuさんとはなんの関係もございません。

経緯

4/15 〜 おっかなびっくりの初期

4/15 くらいから興味を持ってとりあえず運用してみたくてちょっと調べたら「ユーザ名とパスワードを抜かれるから野良インスタンスはウンタラカンタラ」というような運営者の信用の話があったので、OAuthで解決するのが妥当かと考えました。そして私や私の周囲の人で楽しめる形にするにはGitHubでのOAuthが最善で、その後の個人的な改造にも楽しみが増えると思っていました。もともとこういうサービスを自分で作りたかったことも動機の一つです。

GitHubでのログインを対応させて下記を4/16に書いていますね。とりあえずぼっちだったんですね。 www.facebook.com

HerokuのFreeDynoは早々に見切りを付けて1Dyno使い出しました。FreeDynoはSwapが実装されていないので、少しアクセスが増えるとメモリ不足のエラーが出てしまうのですね。そのままだと利用に支障をきたすと考えて課金生活を始めました。周囲の情報からメモリの使用が尋常ではないと知ったので、そのままでは難しいと思いました。

mstdn.techdrive.top

最初に日報を書いたのが 4/17らしいです。このころは「じゃじゃ馬馴らし」的な気持ちでやっていたと思います。設定できそうなのが下記です。

  • WEB_CONCURRENCY
  • MAX_THERADS
  • Sidekiq concurrency

WEB_CONCURRENCY × MAX_THERADS の分だけスレッドが利用されるはず(その分並行処理が増えるのでメモリも使うはず。Puma環境詳しくないですが https://github.com/puma/puma#clustered-mode あたりを見るとその様子です)で、それとは別にSidekiq concurrency も並行処理分メモリを使うだろうということらしいです。

なので、やばそうになるとこの辺りの数値を調整してメモリ利用をし過ぎないように調整していました。かなり絞りまくっていたのがこの時期です。

mstdn.techdrive.top

mstdn.techdrive.top

ちなみにこの時点でほとんどお一人様インスタンスなので、通常のWEBサービスと求められることがだいぶ違うと感じていました。全然利用者がいなくてもリソースを食いまくり、課金までさせられるので、あまり得したような気がしません。

4/18 〜 workerを作成して安定

結局、一台での安定は難しいと判断して(常時9割近くメモリを消費する状態では安心できません)、workerを立ててみたところだいぶ安定してきました。worker自体の負荷が高かったわけではなく、webの方なのかと感じたのもこのあたりです。また、DBへの負荷が高いとよく言われていますが、Heroku Postgresを利用しているので私が関知するところではなくなっているのは幸運でした(Herokuさんごめんなさい)。Rollbarなども入れてエラーがわかるようになったのはこの頃です(あまりに多くて若干引きました。Slackに流すとかしなくて良かったです)。

mstdn.techdrive.top mstdn.techdrive.top mstdn.techdrive.top mstdn.techdrive.top

理屈では、WEB_CONCURRENCY × MAX_THERADS + Sidekiq concurrencyでDB接続をすると思うので、DB_POOLの値はそれを超えて少し余裕をつけるようにしています。この辺り最初の頃は乱暴に設定していたのでDBに接続できないエラーがRollbarに通知されていました。

ちなみにストリーミングサーバーの構築に全く触れていませんが、Herokuのアプリケーション一つでは難しそうです。みなさん工夫されている様子です。 qiita.com

4/22 初めてのVerup

最初どこかのmasterをforkして持ってきてしまったので自分が運用しているバージョンすら知らなかったのですが、ver1.2.2が出たとのことでバージョンアップ。怖かったのでstagingを用意して、これでうまくいくか確認してから行いました。Herokuには特定のGitHubのブランチを監視して変更があれば自動デプロイする仕組みがあるので、今はこれを生かしてマージ=デプロイの運用をしています(本当はCircleCIなどで環境作りたいですがちょっと時間が足らずできていません)。

mstdn.techdrive.top mstdn.techdrive.top mstdn.techdrive.top

ここではmastodon:dailyを仕掛けないとやばいという話が伝え聞こえていたので、それだけは忘れずにやろうと決意して臨みました。

4/23 〜 安定期

この辺りでやっと諸々落ち着いてきた感があり、淡々としています。日報の変化少ないので巻末に入れます。気付いたり思ったこととしては下記です。

  • 無差別フォローBotはサーバーの負荷になるのでブロックすること(フォローされると、トゥートの度にこちらのサーバーがアクションしなければならなくなるのでリソースを食います)。
  • テキストばかりのインスタンスでローカルTLに2〜3人のせいか、ポツポツ人が増えてもそれほど大きな負荷にはなっていません。
  • Herokuはこれくらいならひょっとすると人数捌けるのかもしれません。人数増えないのでGitHubのアカウントお持ちの方は https://mstdn.techdrive.top/ へ遊びに来てくださいー。
  • チューンするならWebからやりたいです。
  • 改造は少しずつが良いです。GitHubログインだけできれば良いと思ってガサッと機能を削ってみたのですが、アプリにログインするのにOAuthだと邪魔になるケースなどがあり、結局かなり戻しています。
  • サインアップを1秒ごとに狙ってくる輩がいます。これをブロックしておかないとメアドログインのインスタンスは荒らされそうな気がします(OAuthログインなのでエラーログに出てきます)。

これまでの人数の増減などは下記で見ると良いかもしれません。 https://dashboards.mnm.social/dashboard/db/instance-detail?var-instance=mstdn.techdrive.top&refresh=30m&orgId=1

お礼など

Herokuでの工夫はzunda氏のトゥートやGitHubを大変参考にさせていただきました。まだまだ私の知らない工夫をされているので、追いついていきたいです。

mastodon.zunda.ninja github.com

付録

23日以降の日報

mstdn.techdrive.top mstdn.techdrive.top mstdn.techdrive.top

mstdn.techdrive.top mstdn.techdrive.top mstdn.techdrive.top

TECH DRIVEについて

TECH DRIVEは「技術者の成長を加速させる」をキーワードに都内で活動をしているコミュニティです。
TwitterやFacebookにて技術ネタやイベント情報の発信を行っていますので、ご興味があれば、いいねやフォローをお願いいたします。