コンテンツにスキップ

重いCGIはniceで謙虚に

[質問]

<<前の質問から続き

linuxの共用サーバーで、apacheです。タイムアウト60秒だと管理者から怒られますかね。

[回答] Gemini

Linuxの共用サーバーでApacheをご利用ですね。結論から言うと、「60秒間CPUをフル回転させる処理」を何度も走らせると、管理者から警告を受けたり、アカウントが一時停止されたりするリスクは十分にあります。

共用サーバーは、一つのコンピュータ(CPUやメモリ)を数百人で分け合っている状態だからです。


なぜ「怒られる」可能性があるのか?

共用サーバーの管理者が最も嫌うのは、「特定のユーザーがリソースを独占し、他のユーザーのサイトを重くすること」です。

  1. CPU使用率のスパイク: factorint()(素因数分解)は非常にCPU負荷が高い計算です。これが60秒間フル稼働すると、同じサーバーに同居している他のサイトのレスポンスが極端に低下します。
  2. プロセスの蓄積: もし複数のユーザーが同時に巨大な数字を投げ込み、それぞれが60秒間計算し続けたら、サーバーのロードアベ 平均(負荷指数)が跳ね上がり、最悪の場合サーバーがダウンします。
  3. リソース制限(LVEなど): 多くの共用サーバー(CloudLinuxなど)では、1ユーザーが使えるCPU時間やメモリに制限を設けています。制限に達すると、60秒経つ前にサーバー側から強制終了(508 Resource Limit Is Reached)されます。

穏便に運用するための3つの対策

管理者とトラブルにならずに計算サービスを公開したい場合、以下の工夫を検討してみてください。

1. タイムアウトを短く設定する(現実的なライン)

「60秒」はWebのレスポンスとしてはかなり長いです。まずは 5〜10秒 程度に設定し、「これ以上の計算はできません」とエラーを出すのが、共用サーバーにおけるマナーとしては適切です。

2. 入力値の桁数を制限する

計算を走らせる前に、入力された数値の「桁数」をチェックしましょう。

import sys
# 例えば50桁以上の数値は受け付けない
if len(user_input_str) > 50:
    print("数字が大きすぎます。制限により50桁までとしています。")
    sys.exit()

3. nice 値(実行優先度)を下げる(Linux特有)

自分のプログラムの実行優先度を下げることで、他のユーザーの処理を邪魔しにくくできます。

import os
# 実行優先度を下げる(19が最低優先度)
os.nice(19)
# この後に factorint() を実行

これをしておくだけで、「他のサイトが忙しいときは、自分の計算を後回しにする」という挙動になり、サーバー全体の動作を阻害しにくくなります。


結論

「たまに数秒動く」程度なら見逃されることが多いですが、「常に60秒フルでCPUを回す」ような使い方は、共用サーバーでは規約違反(迷惑行為)とみなされる可能性が高いです。

まずは signal を使って 10秒 程度でタイムアウトさせ、os.nice(19) を併用して低負荷をアピールする構成から始めてみてはいかがでしょうか?

もしよろしければ、具体的に「どの程度の桁数」を扱いたいのか教えていただければ、もっと安全な実装方法(例えば一部を事前計算しておくなど)を提案できるかもしれません。