重いCGIはniceで謙虚に
[質問]
linuxの共用サーバーで、apacheです。タイムアウト60秒だと管理者から怒られますかね。
[回答] Gemini
Linuxの共用サーバーでApacheをご利用ですね。結論から言うと、「60秒間CPUをフル回転させる処理」を何度も走らせると、管理者から警告を受けたり、アカウントが一時停止されたりするリスクは十分にあります。
共用サーバーは、一つのコンピュータ(CPUやメモリ)を数百人で分け合っている状態だからです。
なぜ「怒られる」可能性があるのか?
共用サーバーの管理者が最も嫌うのは、「特定のユーザーがリソースを独占し、他のユーザーのサイトを重くすること」です。
- CPU使用率のスパイク:
factorint()(素因数分解)は非常にCPU負荷が高い計算です。これが60秒間フル稼働すると、同じサーバーに同居している他のサイトのレスポンスが極端に低下します。 - プロセスの蓄積: もし複数のユーザーが同時に巨大な数字を投げ込み、それぞれが60秒間計算し続けたら、サーバーのロードアベ 平均(負荷指数)が跳ね上がり、最悪の場合サーバーがダウンします。
- リソース制限(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特有)
自分のプログラムの実行優先度を下げることで、他のユーザーの処理を邪魔しにくくできます。
これをしておくだけで、「他のサイトが忙しいときは、自分の計算を後回しにする」という挙動になり、サーバー全体の動作を阻害しにくくなります。
結論
「たまに数秒動く」程度なら見逃されることが多いですが、「常に60秒フルでCPUを回す」ような使い方は、共用サーバーでは規約違反(迷惑行為)とみなされる可能性が高いです。
まずは signal を使って 10秒 程度でタイムアウトさせ、os.nice(19) を併用して低負荷をアピールする構成から始めてみてはいかがでしょうか?
もしよろしければ、具体的に「どの程度の桁数」を扱いたいのか教えていただければ、もっと安全な実装方法(例えば一部を事前計算しておくなど)を提案できるかもしれません。