月€8のVPS 1台で自動処理を60本動かした実測(Contabo・41日連続稼働)

月€8のContabo VPS 1台に、cron登録の自動処理を60本と、Webサイトを4つ同居させて41日間無停止で動かしています。実際に何が余っていて、何が最初に詰まったのかを、手元の実測値だけで書きます。

構成:月€8のVPS 1台に全部乗せている

使っているのはContaboのアジア・シンガポール拠点のVPSで、料金は月€8.00です。スペックはCPU 4コア、メモリ7,941MB、ディスク72GB。OSはUbuntu 24.04で、Apache 2.4 / PHP 8.3 / MariaDB という構成です。

この1台に乗っているものは、大きく分けて2種類あります。

  • cronに登録した自動処理:60本
  • Webサイト4つ(WordPress 2つ、Node.jsアプリ2つ)

自動処理の内訳は、SNS自動運用が50本、YouTube関連が13本、ブログ記事の自動生成・投稿が3本です。この内訳を単純に足すとcron 60本という数と一致しません。1本のジョブが複数の用途にまたがっているのか、私の数え方がずれているのか、正確なところは把握できていません。ここは「分かっていない」とだけ書いておきます。

実測

41日 連続稼働
この間、無停止。再起動もしていません。

実測:CPUもメモリもディスクも余っている

41日間動かしたあとの数字がこちらです。

uptime      : 41日(無停止)
memory      : 1,442MB / 7,941MB 使用
disk        : 72GB のうち 22% 使用
load average: 1.34 / 1.76 / 1.92(4コア)

メモリは7,941MB中1,442MBしか使っておらず、約6.3GBが手つかずで残っています。ディスクも72GBの22%です。load averageは1.34〜1.92で、4コアに対してこの値なので、CPUも張り付いてはいません。

メモリ使用量(41日稼働時点)
メモリ使用量(41日稼働時点)

「60本」でも同時に動いているのは2つだけ

数字が思ったより低かったので、実際に走っているPythonプロセスを数えてみました。結果は2つです。

理由は単純で、60本を24時間に散らして登録しているからです。cronの本数は「登録数」であって「同時実行数」ではありません。ここを混同すると、必要以上のスペックを買うことになります。60本という数字だけ見ると重そうに感じますが、実行タイミングをずらしていれば、瞬間的な負荷は数本分にしかなりません。

ポイント

サーバーの負荷を決めるのはジョブの本数ではなく、同時に走る本数です。60本登録していても、同時実行が2本なら2本分の負荷しかかかりません。

唯一、明確にサーバーを重くしたのは ffmpeg

ここまで余裕がある構成でも、1つだけ実害が出た処理があります。動画生成のffmpegです。

ffmpegはCPUを素直に使い切りにいくので、放っておくと動画の書き出し中に、同じサーバーに同居しているWebサイトの表示が遅くなりました。自動処理のためにサイトの応答が犠牲になるのは本末転倒です。

失敗したこと

ffmpegを何も制限せずにcronから叩いていた時期は、書き出しが走るたびに同居中のWebサイトが重くなりました。自動処理は成功しているのに、サイト側が遅いという状態です。

対策として、実行時に使うコアと優先度を落としました。

taskset -c 0-1 nice -n 10 ffmpeg ...

taskset -c 0-14コアのうち2コアに限定し、nice -n 10優先度を下げる。この2つを付けただけで、書き出し中にWebサイトが遅くなる症状は出なくなりました。残り2コアがWebサイトの応答用に空くこと、そして優先度が低いのでApacheやPHPに割り込まれることが効いています。

うまくいったこと

CPUを食う処理は「止める」のではなく「コアを絞って優先度を下げる」だけで同居できました。動画の書き出し自体は今も同じサーバーで走っています。

本当のボトルネックはサーバーではなかった

41日運用してはっきりしたのは、詰まる場所はCPUでもメモリでもなく、各サービスのレート制限だったということです。

メモリは6.3GB余り、ディスクは78%空いていて、同時実行のPythonプロセスは2つ。この状態で「もっと本数を増やせるか」を考えると、増やせない理由はサーバー側にはありません。投稿先・取得先の各サービスが受け付けてくれる回数が上限で、それ以上叩けないから間隔を空けている、というのが実態です。

注意

自動処理の本数を増やしたいときにまずサーバーを増強するのは、順番が違う可能性があります。私の環境では、上限を決めていたのは契約プランではなく、相手側サービスの制限でした。増強しても叩ける回数は増えません。

この構成で言えること/言えないこと

  • 4コア / 7,941MB / 72GB の1台で、cron 60本とWebサイト4つを41日間無停止で回せた
  • ジョブを24時間に散らせば、同時実行は2プロセス程度に収まった
  • ffmpegは tasksetnice で同居先のWebサイトへの影響を消せた
  • cron 60本と内訳(50 / 13 / 3)の対応関係は、正確には把握できていない
  • 41日より長期で、あるいは同時実行がもっと増えたときにどうなるかは未検証
  • 各サービスのレート制限の具体的な数値は、この記事では扱っていない

結論として、月€8のVPS 1台は、この規模の自動処理では余っていました。ただしそれは「安いサーバーで何でもできる」という話ではなく、CPUを食う処理を1つだけ隔離した結果であり、かつ本数の上限をサーバーではなく外部サービスが決めていたから成立している、というのが実際のところです。

まとめ

  • 月€8 / 4コア / 7,941MB / 72GB のContabo VPS 1台で、cron 60本+Webサイト4つを41日間無停止で運用中
  • メモリは1,442MB / 7,941MBしか使わず、ディスクも22%。load averageは1.34 / 1.76 / 1.92
  • 60本あっても24時間に散らしているため、同時に走るPythonプロセスは2つだけだった
  • 唯一の実害はffmpeg。taskset -c 0-1 nice -n 10 で2コアに限定+優先度を下げて解決
  • ボトルネックはCPUでもメモリでもなく、各サービスのレート制限だった
  • cron本数と内訳の数が合わない点、41日を超える長期挙動は分かっていない