PHPが次第に遅くなるという現象に関してです。

さくらVPS上に、PHP、MYSQL、Apacheをインストールし、PHPを定期実行させています。(5分おき)。
PHPであるページの情報を取得し、それをMYSQLに保存するような内容です。

処理自体は当初2秒位で終わるのですが、処理の回数が増えるにしたがって、だんだんと処理時間が伸びていきます。

24時間もたつと数十秒かかるようになります。



サーバを再起動すると、また当初のように処理時間は短くなります。



お伺いしたいことは、これが発生する原因としては、どのような仮説が考えられるでしょうか。解決する方法も教えていただけると嬉しいです。

よろしくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/08/19 16:35:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

ポイント50pt

PHPリクエストを実行しているApacheプロセスが生き残ったまま次のリスクエストに入っているのではないでしょうか。
apache_child_terminate関数でプロセスを切ってみてください。
http://php.net/manual/ja/function.apache-child-terminate.php

id:tomohirof

ありがとうございます!実行してみます!

2012/08/12 20:24:21
id:taroe No.2

回答回数1099ベストアンサー獲得回数132

ポイント50pt

実際に、どの部分がどの程度の時間がかかっているかを
調べたほうが良いと思いますよ。

1回のリクエストで2秒とか、10秒とか言っても
どの部分がネックになてるとかがわからないわけですから。



■コネクションとかの
DB接続のためのコネクションとかその周り系
コネクションプールとか使ってる場合とか・・・。
このあたりで、待ちが生じて時間がかかっている場合。


■ループしてるなら
>PHPであるページの情報を取得し、それをMYSQLに保存するような内容です。

ループとかしてるののなら
毎回のリクエストで、何回ループしてるのかを出力して確認してください。

処理秒数と比例する回数、ループしていることもあり得ます。


変数が破壊されてとか
初期化をしてないとか
そういうのもあり得るかと。

  • id:windofjuly
    うぃんど 2012/08/12 16:54:53
    >PHPを定期実行させています

    cronなどでphpスクリプトを5分に1回起動する方式であれば、
    そのようなことになることは考え辛いので、
    今回の場合は1つのphpスクリプトを動かし続け、
    5分に1回データ取得しているのではないかと思われるがいかがか?
  • id:tomohirof
    そんなことないんですよ。。5分に1回起動させてるんです。。。

    さくらのレンタルサーバでは、そのようなことはなかったのですが、VPSに移したらこのような状況になったので、ApacheやPHP,MYSQLの設定なのかな。。と疑ってます。
  • id:windofjuly
    うぃんど 2012/08/12 17:06:38
    cronから呼び出しているならapacheは関係ないはず。
    関係があるとすれば、シェルからphpを呼び出しているのではなく、
    シェルから(たとえばwgetなどを利用して)
    自サバのapache経由でphpスクリプトを動かすなどしているのでは?

    レンタルサーバーであれば多人数の利用に支障をきたさない程度に、
    apacheのkeep-aliveなども短く設定されているはずですが、
    VPSだとそのあたりは設定者次第・・・。
  • id:tomohirof
    なんどもコメントありがとうございます。

    ちょっと例外的な対応をしておりまして、外部サーバのCRONで、該当サーバのPHPファイルのURLを叩いています。(CRONを使えないレンタルサーバもあったので、擬似的にCRON的な処理をしてました。)

    いただいた情報から、apacheのkeep-alive設定を見てみます!参考になります!
  • id:fut573
    VPCのコントロールパネルからCPU使用率見ていただけませんか?
    さくらのVPSでcronの記述をミスっていた場合、実行一回ごとにCPU使用率が100%ずつ増えていくという現象が起こったケースがあります。
  • id:windofjuly
    うぃんど 2012/08/12 19:51:25
    MySQLとの接続などもあるのでapache_child_terminatで強制的に開放させようとするならば、
    apache側でMaxRequestsPerChildを少なめに設定してこまめに開放するようにしたほうがいいですね。
  • id:tomohirof
    fut573さん、ありがとうございます。
    VPSのコンパネのCPUの使用率は、最終的には天井に貼りつく形になります。
    ですが、さくらのVPS上のCRONではないので、記述ミスではないかもしれません。

    windofjuly さん、ありがとうございます。
    参考になります。いただいた内容を一つずつ試してみます!
    何度もすいません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません