【Railway】MySQLサービスをコスト抑えて運用する
2026.01.19

どもです。
年初よりRailwayを扱っており、大体できることできないことも把握してきた今日このごろです。
というより、最近は別のこともしてちょっと忘れがちだったのでRailwayについての備忘録程度で。
前回、「無料でウェブアプリケーションを運用できるか?」といったテーマで、あけましておめでとうございますmm DjangoアプリをRailwayに移行する。という記事書いたのですが、結構厳しいね。(笑)
初回無料分$5が毎月付与されれば大丈夫ですが、翌月から$1ということでそれは超えてしまう。
ですが、なんとか大体 $5〜$6にくらいに収まるくらいではないか。
この$5〜$6もウェブアプリケーション2個分の値段。
調子に乗って、RailsアプリケーションもRailwayに乗せたのでその内容はまた別途とし、
一つくらいであれば、$2〜$3で放置運用できるのはと思いました。
そもそもRailwayの値段構成ですが、RailwayのTopページにこのような記載があります。
| 項目 | 料金区分 | 単価 | 単位 |
|---|---|---|---|
| メモリ (Memory) | コンピューティング | $0.00000386 | GB / 秒 |
| CPU | コンピューティング | $0.00000772 | vCPU / 秒 |
| ボリューム (Volumes) | ストレージ | $0.00000006 | GB / 秒 |
| オブジェクトストレージ | ストレージ | $0.015 | GB / 月 |
| データ転送 (Egress) | ネットワーク | $0.05 | GB あたり |
とあります。
Rails + MySQLのサービスを稼働させようとして、メモリの使用量が以下の通りだったとする。
| サービス | メモリ |
|---|---|
| Rails | 約 140MB |
| MySQL | 約 300MB |
合計 440MB。つまりメモリを合計で0.44 GB使用。
Railwayの使用料金は、Memory: $0.00000386 / GB / sec = 1GB を 1ヶ月使うと 約 $10 と考える。
月額コスト計算(24h × 30日)
■ メモリ料金
0.44 GB × $10 ≒ $4.40 / 月
サービス別内訳
Rails: 0.14 GB × $10 = $1.40 / 月
MySQL: 0.30 GB × $10 = $3.00 / 月
とざっくり計算でこうなる。
その他にもCPUやボリュームの使用量が加算されますが、放置運用だとCPUもボリュームもほぼ使わずこちらは$0に近いのですが、メモリだけはサービス稼働させるために常に使用する形になるので、コストが掛かってくるのはメモリ使用量と捉えて良い。
したがって、コスト削減を試みるとなるとこのメモリ使用量を可能な限り落とせば良い。
ということもあって、色々とコスト削減の為、チューニングを頑張ってはいました。
ただやりすぎるとサービスに影響するので、あまり多くない人が閲覧できるくらいの形で運用できるか。
Railwayのコスト削減において、MySQLサービスが簡単に落とせるので、あまりフルで活用しないのであれば抵コスト運用に設定しておいたほうが良いかと思います。
というのも、MySQLサービスを作成時のデフォルト設定が結構メモリを喰う設定なので何もしないとただただお金を落としていきます。
MySQLサービスをボタンひとつで追加できる気軽の反面、デフォルトでは結構もったいない設定で追加されます。
追加したばかりで何もしないとメモリを360MBくらい使用した形となっています。

設定というのが、Custom Start Commandになります。
Custom Start Command
docker-entrypoint.sh mysqld --innodb-use-native-aio=0 --disable-log-bin --performance_schema=0 --innodb-buffer-pool-size=1G
ここを見てみると、一番大きいのが「–innodb-buffer-pool-size=1G」。1GB 固定確保しておりRailway の MySQL が 200MB超えてる原因ほぼこれとなります。
最優先で直すべき設定で、buffer pool を激減させていきます。
Railway / 小規模構成なら
--innodb-buffer-pool-size=128M
さらに攻めるなら
--innodb-buffer-pool-size=64M
API主体で、同時接続少であれば64Mでも普通に動きますね。
設定しメモリ使用を抑えていきます。


これだけでも下がっていきます。
更にチューニングをしていきたいのですが、一旦、デフォルトのCustom Start Commandを整理すると、
-
--innodb-use-native-aio=0
→ Linux の非同期I/Oを使わない
→ コンテナ環境での安定性優先(パフォーマンスは少し犠牲) -
--disable-log-bin
→ バイナリログを完全に無効化
→ レプリケーション不要・ディスク&メモリ節約 -
--performance_schema=0
→ MySQL 内部の詳細メトリクス収集をOFF
→ メモリ削減(10〜30MB程度) -
--innodb-buffer-pool-size=1G
→ InnoDB が 1GB 常駐メモリ確保
→ 高速だけど 小規模サービスでは完全に過剰
状態まとめ
🟥 速いが重い
🟥 Railway / 個人サービスには不向き
🟥 メモリ使用量 300MB超えの主犯
というので、軽量・実運用向けに最終的にチューニングしたCustom Start Commandはこちら。
docker-entrypoint.sh mysqld \ --innodb-use-native-aio=0 \ --disable-log-bin \ --performance_schema=0 \ --innodb-buffer-pool-size=64M \ --innodb_redo_log_capacity=64M \ --innodb-log-buffer-size=8M \ --max-connections=50 \ --thread-cache-size=8
こちらによって、更に削減。

※ 何をしているか
メモリの大物を削減
-
--innodb-buffer-pool-size=64M
→ データ&インデックスの常駐キャッシュ
→ 1GB → 64MB
→ 小〜中規模DBなら十分 -
--innodb_redo_log_capacity=64M
→ トランザクションの書き込みログ容量
→ デフォルト(数百MB)を強制縮小 -
--innodb-log-buffer-size=8M
→ トランザクション一時バッファ
→ 書き込み頻度低めなら問題なし
接続・スレッドを制限
-
--max-connections=50
→ 同時接続数を制限
→ メモリ爆発防止(1接続あたり数MB) -
--thread-cache-size=8
→ スレッド使い回し
→ CPU負荷とメモリのバランス取り
チューニング後の状態
- 安定
- 軽量(130MB前後)
- Railway / 個人プロダクト最適
140MB行かないくらいで常時稼働させています。

また、2サービス稼働させていても、半月経ってもまだ無料枠分が残っています(最初の方の日は非チューニンだったので予定より減っている)

ここ以外にも、DjangoやRails側も調整しましたが、内容はまた追って。
ということで、Railwayで使う際の注意点として使用に向いているのは、
-
個人開発
-
PoC / MVP
-
小〜中規模サービス
と言ったところで、大規模サービスやトラフィックの多いサービスなどには向いてはいないかと思いますので、その際は別のPaaSの検討もしたほうが良いのかと。
ということで、調子乗ってRailsサービスも移行しましたので、次はその内容でもと。
ではではぁ。
またまたぁ。










