専用サーバーでサーバーを借りていましてそこでPHP(5.1.6)、ZendFrameWork(1.7.3)を使っていて気になった点が出てきました。
静的ページを表示するページのメモリ使用率が0.2%のページA、動的ページでphpのphpinfo()を実行して表示するページのメモリ使用率が0.3%のページB、ZendFrameWorkによるMVC構成の最小単位の構成で「Hello world」を表示するページのメモリの使用率が0.3%のページC、の3つのページを用意しました。
この際にたとえばページCを見た後にページBを見て、ページCに戻ると、メモリ使用率が0.5%になっています。
一度この状態になりますとどのページを見ても0.5%のメモリ使用率になってしまっています。数時間後に各ページを見ても同じように0.5%でした。
こういった現象は仕様なのでしょうか。このまま開発を進めていくとどんどんメモリが増えていく気がして気になっております。
サーバーはCentOS 5の物理メモリは4Gになります。メモリ使用率にはtopコマンドで表示されるhttpdの%MEMの値を利用しました。
また上記の現象になる前のデフォルト時での各ページのメモリ使用率が高いという指摘を受けましたがページA,B,Cによるメモリ使用率は高いのでしょうか。
処理の特性にもよりますので、一概にはコメントしづらいのですが…、
約20MB(4GBの0.5%)であれば、少し多いけどまぁそんなところかなという印象です。
なお、メモリ使用量の確認には、topコマンドではなく、freeコマンドを使って
実際にメモリ使用量の変動する状況を確認されることをお勧めします。
http://www.atmarkit.co.jp/flinux/rensai/tantei01/bangai01a.html
メモリリークが起こっていることが確実だとして、次の内容を拝見すると、
PHPで記述されたプログラム もしくは ZendFrameworkにメモリリークの原因があるように思えます。
こういう事象では、まずサーバー会社さんはお手上げでしょうね…。
次に今回の質問の内容で書かせて頂いたようなページを3つ用意しまして、
同じようにテストを行ったところ、各ページを単体で数百回アクセスしたりする分には、
特にメモリ利用率に変動はなかったもの、交互に行ったり来たりすると、
メモリ利用率が上がる現象が確認できました。
恐らくですが、ZendFrameworkで構築されているページを1ページでも見るとそうなる感じでした。
IBMのページに、メモリー管理関数 memory_get_usage() を使って、
メモリリークがどこで発生しているかを確認するサンプルコードが掲載されています。
こちらも参考にして、原因の切り分け調査を行ってみてはいかがでしょうか。
http://www.ibm.com/developerworks/jp/opensource/library/os-php-v...
また、ZendFrameworkが10MB以上のメモリを使っているという話もありました。
こちも参考までに。
http://d.hatena.ne.jp/boto/20080418/1208524517
Zend_Db_Statement_Mysqli を使ってちょっとしたデータをselectしただけなのに、
10Mになっていたphpの memory_limitを超えてしまってエラーが出ました。
けっこうZend Frameworkはメモリを食ってることに気がつきました。でもおかしいなぁ。
参考リンクなどありがとございます。
こちらの2つのリンクの方は私の方も拝見した事がありまして、
実際にIBMの方のようなテストを行って運用中のサイトで検証してみた事があります。
その結果ですと特にメモリの値が解放されないといった数値が出ている個所は見つかりませんでした。
その結果をサーバー会社に提出した時にはうろ覚えですが、
このメモリの値と言うのはphp単体での値であって、
phpはApache上で動いている一つのプロセスなので、
Apacheが利用しているメモリの一部分を利用しているだけで、
phpが問題なかったとしてもphp以外でメモリリークが起きている可能性もあるみたいな事を言われまして、
あまり参考にならないとの事でした。
確かに検証結果を見ますとmorethanjustaseさんが仰る通りでして、
ZendFrameworkがきっかけでメモリ利用率が上がってる感じでしたので、
ZendFrameworkが原因っぽいのかな?と私も思うのですが、
どうしても府に落ちない点がありまして、
その点と言いますと、
1)別のサーバーで開発してた時にそういった現象が発生していなかった点。
2)ハングアップしたのがサイト公開後の1ヶ月半ぐらいたった後に発生した点。
の2点になります。
1)について
開発期間はトータルで6カ月ほどあったのですが、
最初の3カ月ぐらいは別サーバーで開発しておりまして、
そちらのサーバーではそういった現象は特に発生しておりませんでした。
また残りの3カ月ほどを今回のサーバーで開発しておりましたがそういった現象はありませんでした。
(ちゃんとメモリの利用率などを見たわけではありませんがハングアップなどと言った現象はありませんでした)
2)について
サイト公開後に1カ月半程経った際にハングアップが発生しました。
その際にメモリリークが発生していたのはいつ位からですか?と聞きましたら、
公開時からとの回答を頂きました。
メモリリークが1カ月半積み重なってハングアップに至ったという事ですが、
現状Apacheの設定をハングアップした状態に戻しますと1カ月半もかからずに恐らく数日でハングアップすると思います。
(アクセスなどは公開時よりか下がっていまし、そんなに1日でアクセスがあるようなサイトでもありません。
1日3000あれば良いサイトになります。公開時からサイトの構成なども特に大幅に変わった部分もありません。)
もしZendFrameworkの根本的な原因でメモリリークが発生しているのであれば、
もっと早い段階で開発段階などでハングアップが発生してるのでは?と思ってしまいます。
また、ハングアップが発生する数日前にサイトの方でメールが送信できないという現象が発生しまして、
その際にサーバー会社から言われた事が
「サーバー上でメールを送信する時にSMTPの指定がlocalhost指定でメール送信などを行っていた為に、
DNSの逆引きが発生してしまい大量なメール送信が発生すると処理が正常に行われずにうまく送信がされなかった」
とのことでした。
私の方がサーバーの知識不足でして言われたままにSMTPのホストの指定を
localhostからメールサーバーの指定に変更することでこの時は解決したのですが、
この2,3日後にハングアップが発生しておりまして、
この変更が原因だったりしないのかな?と思ってたりもします。
それにメモリリークが1カ月半も続いてる状況があった中で、
ハングアップするまで何も気づかないというのはサーバー会社としては当たり前なのでしょうか。
急激なメモリリークが発生した為にハングアップに至るまで気がつく事ができなかったのでは?と思ってしまう部分もあります。
開発段階から他にもプログラムで外部からSSHで接続しようとすると、
接続に数分かかってしまったりとか色々問題があったこともありまして、
サーバー会社として疑心暗鬼になっている部分もあるせいかもしれませんが・・・。
最近はphpのバグとかZendFrameworkなどのバグの可能性もありえますとの事をサーバー会社から言われまして、
php,Apacheのマイナーバージョンアップの方も行ってみましたが解決はされませんでした。
ZendFrameworkのバージョンアップも考えていますが、
ZendFrameworkのバージョンはPHPのバージョンに左右されるみたいですので現在は検討中です。
なるほど…。
なんとなく状況が見えてきましたが、「メモリリーク」は、サーバ会社さんが言われていることであって、
nkjmhrkさんには具体的にリソースデータ等が提示されていない、ということのようですね。
2)について
サイト公開後に1カ月半程経った際にハングアップが発生しました。
その際にメモリリークが発生していたのはいつ位からですか?と聞きましたら、
公開時からとの回答を頂きました。
サーバ会社さんに、その根拠となるリソースデータの提示をお願いしてみてはいかがでしょうか。
メモリ使用量の推移が見て取れるグラフ等が用意されているかも知れません。
まあ、それぐらいのサービスを受けられる契約かどうか、という問題もありますが…。
根拠となるデータが怪しければ、そこに調査の時間を費やすのももったいないですし、
特定の日からメモリ使用量が急増しているなら、調査のヒントになる可能性もあります。
(それこそ、SMTPの設定変更の日からメモリ使用量が急増していて、ドンピシャだったとか)
それにメモリリークが1カ月半も続いてる状況があった中で、
ハングアップするまで何も気づかないというのはサーバー会社としては当たり前なのでしょうか。
急激なメモリリークが発生した為にハングアップに至るまで気がつく事ができなかったのでは?と思ってしまう部分もあります。
リソースデータは取得しているが、閾値超えのアラームは上げていない、なんて運用はザラにありますよ。
つまりは、リソース監視はしていても、何か問題が起きるまでは、誰も異常に気が付かない。
このあたりは、サーバ会社さんのサービスレベルや、結んでいる契約次第だと思います。
ちなみに、サーバ会社の方と話をされるのであれば、次の記事は事前に一読をお勧めします。
難しい言葉を連発して煙に巻こうとする担当者の方もおられるでしょうから…。
減り続けるメモリ残量! 果たしてその原因は!?
http://www.atmarkit.co.jp/flinux/rensai/tantei01/bangai01a.html
そうなんです。サーバー会社からメモリリークとは言われているのですが、
具体的にリソースデータ等は頂いてはいません・・・。
ちょっとこの辺りを言ってみたいと思います!
参考リンクありがとうございます!
まだ全部読んでませんが大変参考になりそうな記事ですので、
後程じっくり読みたいと思います。
確か契約は24時間監視とか、定期的に実際の人がサイトを目視して確認などを行っているとかは
契約時に聞きましたが実際に行われているかは不明ですね・・・。
恐らくmorethanjustaseさんが仰ってるケースと同じで、
「リソース監視はしていても、何か問題が起きるまでは、誰も異常に気が付かない」
感じなのかなと思います。
実は弊社のグループ会社でもこちらのサーバー会社を利用して
サイトの方をいくつか運用の方をしていたのですが、
そちらでも色々と問題があったみたいでして、
今年に入ってサーバー会社の方を変更したりとありまして、
色々問題がある会社さんなのかな~っと思ってたりもします。
質問する前からこういった質問の回答は難しいだろうな~って思っていたのですが、
morethanjustaseさんから回答の方を頂けたので嬉しかったです!
あまり周りにこういった事を相談できるような人がいなかったものでして、
お話を聞いて頂けただけでも何か癒されました(笑)
明日でこの質問の回答の受付日が最後と言う事もありますので、
問題の解決という意味では現状まだそこまでは至ってませんので、
またそのうち質問の方をするかもしれませんが、
その際にまた何かご存知の事がありましたらお力を貸して頂けましたら幸いです!
色々ありがとうございました。
0.5%というのは特に高くないという事はわかりました。freeコマンドの方でも確認したいと思います。
ありがとうございました。
私の説明不足で済みませんが、
私が一番知りたい個所と言いますと、
このページA,B,Cの各ページにアクセスした時のメモリ使用率が0.3%や0.2%だったものが、
別のページを見て戻ってきた際に上がってしまうという点でして、
こういった現象はサーバーとしては普通なのでしょうか。
単純に考えてしまうとページが増えていけば増えて行った分だけメモリが増えるのでは?と思っている次第です。
もしこの点について何かご存知でしたら教えて頂きたいと思っております。
またメモリ利用率についてですがこの0.5%が高いというのは専用サーバーを借りているサーバー会社からの指摘でして、
そこの会社で運営しているサイトで同じサーバー構成で1日で300万PVあるサイトでPHPのプログラムを普通に色々利用した状態で、
メモリの利用率は0.2%という説明を受けました。
(こちら側がPHPプログラムで記述してるのはphpinfo()のメソッド一つ呼び出すだけで0.3%の利用率です)
だから静的ページで0.2%は高いみたいな事を言われた次第です。
静的ページも単純に画像が数枚あるだけのhtmlです。
追記になってしまって申し訳ありませんが
質問の文章に文字数制限があるため要点のみしか書いていなかったのですが、
何でこんな事を調べているかと言いますと一番の要因は運用中のサイトにメモリリークが発生しており、
その調査を行っている状況です。
最初にメモリリークが原因でサーバーがハングアップした際に、
メモリ利用率が異常に高い。どこかでメモリリークが発生してるのが原因ですと言われまして、
その際に静的ファイルで0.2%高いなどと指摘された次第です。
メモリリークが発生後の値では無く、サーバーの再起動直後の値で0.2%です。
(現状はApacheの設定でMaxRequestsPerChildを200にすることでハングアップは防げている状況です)
サーバー会社にDatabase関係で起きている可能性がありますとも言われまして、
どうせプログラムを調べるならもっと単純なプログラムや静的ファイルなどから順を追って調べて行こうと思い
少しずつ調べて行っていました。
まず最初に、
A)静的ページ(htmlタグ、headタグ、bodyタグだけの構成でbodyの中は空。0.2%の利用率)、
B)動的ページ(phpinfoを実行するだけのページ。0.3%の利用率)、
C)動的ページ(databaseに接続するだけのページ。0.3%の利用率)、
D)動的ページ(databaseに接続し、SELECTを実行するページ。0.3%の利用率)、
の各ページを作成し、
各ページを単体で連続で数百回アクセスなどを行いメモリ使用率などを見てみました。
この際には各ページども最初の状態からメモリ使用率などが上がる事はありませんでした。
またこのA,B,C,Dの各ページを交互に見たりしても特にメモリ利用率が上がる事がありませんでした。
次に今回の質問の内容で書かせて頂いたようなページを3つ用意しまして、
同じようにテストを行ったところ、各ページを単体で数百回アクセスしたりする分には、
特にメモリ利用率に変動はなかったもの、交互に行ったり来たりすると、
メモリ利用率が上がる現象が確認できました。
恐らくですが、ZendFrameworkで構築されているページを1ページでも見るとそうなる感じでした。
この現象が起きてしまうとどのページを見てもメモリ利用率が上がってしまっていまして、
これってどういう事なんだろう?と思いサーバー会社に質問しますと、
確かにこういった現象はおかしいと言われましたが、
これがメモリリークの原因なのかわからないと言われてしまいこちら側としてはお手上げ状態です。
静的ファイルでも殆ど何も行っていないページだったり、
プログラムも殆ど何もしていないページなのに、
既にメモリ利用率が上がってしまっていますので、
実際に運用中のプログラムなどを使ってテストしても、
あまり意味がないと思っておりまして、
この段階でのメモリ利用率の上昇理由を調べておりました。
特にこの上昇がサーバーとして問題ないようでしたら、
次の段階のテストなどを行いたいと思っているのですが、
サーバー会社も原因がわからないっていうだけで
それが問題ないのか分かっていない状況です。