質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

21975閲覧

Apacheのメモリが少しずつ増加し圧迫【PHPメモリリーク】

izayoi136

総合スコア17

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

3グッド

4クリップ

投稿2016/04/21 13:28

編集2016/04/22 02:38

###前提・実現したいこと
ApacheにおいてPHPのメモリリークと思われる現象により、メモリが30分に2~3MB程度ずつ増加していっています。増加をとめるかApacheの全体メモリを1GB程度で抑えて正常稼動させたいと考えています。
※本来はプログラムの修正を行うのが当然ですが
※担当部署が異なり緊急対応が必要な為難しい状態です。

質問は1点です。

  1. 何か有効な対応策があればご教示下さい。

CronでのApache定期再起動は最終手段と考えています。

###発生している問題・エラーメッセージ

top - 15:45:21 up 77 days, 4:57, 1 user, load average: 1.66, 2.15, 2.01 Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie Cpu(s): 2.7%us, 3.1%sy, 0.0%ni, 93.6%id, 0.3%wa, 0.0%hi, 0.2%si, 0.1%st Mem: 5823320k total, 4310684k used, 1512636k free, 713208k buffers Swap: 2064380k total, 3156k used, 2061224k free, 883008k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 14511 webuser 20 0 1548m 1.1g 4444 S 8.3 19.7 0:00.27 httpd 14514 webuser 20 0 1548m 1.1g 5528 S 4.0 19.7 0:00.19 httpd 14547 webuser 20 0 1548m 1.1g 4736 S 1.3 19.7 0:00.06 httpd 14510 webuser 20 0 1548m 1.1g 5496 S 0.7 19.7 0:00.16 httpd ※Apache再起動直後のApache子プロセスの使用メモリは20MB前後 ※先日はSWAPが発生しPHPスクリプトの一部機能が動かず障害が発生

###試したこと
Apacheのコンフィグに
MaxRequestsPerChild 30
を設定した結果、子プロセスはリクエストにより周期的に循環を行っているようですが、新しく生まれたApache子プロセスのVIRTとRESの値はリセットされず継承され現在も増加する不都合が起こっています。

現在のApache設定
<IfModule prefork.c>
StartServers 10
MinSpareServers 4
MaxSpareServers 20
ServerLimit 100
MaxClients 100
MaxRequestsPerChild 30
</IfModule>

###補足情報(言語/FW/ツール等のバージョンなど)
CentOS6.5 Apache2.2 PHP5.3.3

何卒宜しくお願いします。

KiyoshiMotoki, yodel, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

mod_phpをお使いで、メモリリークしているcgiが特定できているなら、

<FilesMatch "hogehoge.php$">
AddHandler cgi-script .php
Action cgi-script /cgi-bin/php-cgi
</FilesMatch>

などとして、該当cgiだけcgiモードで動かすとかはいかがでしょう?

私はperl使いでphpは門外漢ですが、
昔、広報がホームページを外注すると、
外注先がmod_perlに対応しないcgiを書いてくるので、
よくこの手法で対応しました。

phpの設定については自信ないので、確認してください。

投稿2016/04/24 07:56

chun

総合スコア324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

izayoi136

2016/04/25 06:38

chun様 御回答有難う御座います。 素晴らしいアドバイス大変助かります。 CGIモードでの対応が早いかもしれません。 検証の上、稟議を出して見ようと思います。
guest

0

増加のペースが記載のとおりだとすれば、週に一度の対応で良いはずなので、根本原因の調査に力を入れられてはいかがですか?
または一旦メモリの大きなサーバに移すとか。クラウド環境を使用すれば、準備にそれほど時間もかからないはずです。

投稿2016/04/21 14:10

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/04/21 14:25

ご回答の内容には同意です。 ただ、 > 週に一度の対応で良いはず については、 「リークしたメモリが1MBに達するのが約1週間」 という計算をされていませんか? 質問者様の要望は > Apacheの全体メモリ(*)を1GB程度で抑えて  * つまり、リーク部分以外のメモリもあわせて ということかと思いますので、実際はもっと頻繁に対応する必要があるはずです。
izayoi136

2016/04/21 16:32

te2ji様 >根本原因の調査に力を入れられてはいかがですか? 言い訳がましくなりますが プログラムの改修は予算がつかず対応が難しい状態で。一度リリースさされてしまうと、別会社への予算がとてもつきにくいのです。またメモリリークは探すのが困難であり、サーバー側で対症療法でなんとかならないかあがいている状態です。 >週に一度の対応で良いはずなので、根本原因の調査に力を入れられてはいかがですか?  1日におよそ70MB増加しており、なんとか凌げないこともないのかなと考えています。現在は安全の為2日に一度深夜にWEBサーバをリブートしております。  
izayoi136

2016/04/21 16:34

te2ji様 ご提案有難う御座います。 対応を模索したいと思います。
izayoi136

2016/04/21 16:42

KiyoshiMotoki 様 > Apacheの全体メモリ(*)を1GB程度で抑えて >* つまり、リーク部分以外のメモリもあわせて >ということかと思いますので、実際はもっと頻繁に対応する必要があるはずです。 Apache全体の使用メモリが1GBを超えたあたりでロードアベレージがかかり、不安定になります。また、2GBに達した時にSWAPを食い出し、一部機能がシステムダウンを起こしてからは1~2日に一度深夜に私がリブート対応しています。 皆様にお知恵を貸して頂いて有り難いです。
退会済みユーザー

退会済みユーザー

2016/04/21 16:42

> ※本来はプログラムの修正を行うのが当然ですが > ※担当部署が異なり緊急対応が必要な為難しい状態です。 こちらのコメントが緊急対応を必須としているように感じたため、「そんなに急ぐこともないのでは?」回答したつもりでした。 予算のほうがしんどいのですね。理解しました。 となると、あまりお役に立てることがなく、申し訳ないです^^;
izayoi136

2016/04/21 16:49

te2ji様 非エンジニア中心の職場で、悩みながら孤独に深夜対応しているので 問題を共有して考えて頂いたことだけでもとても嬉しく思っています。
guest

0

自分の場合は、composer.jsonを直接編集することはないですね。

ライブラリ追加は↓でできますし。

sh

1composer require "hoge/fuga"

updateはpackage指定してupdateでいけますし。
なので、composer installだけでcomposer updateは使わないです。

投稿2016/04/26 04:07

miwata

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

現状でできそうなことといえば

・ServerLimit と MaxClients の値を50ぐらいに減らす
・大きなデータを扱う処理がないのであれば、php.ini の memory_limit を 8~16MBぐらいで設定する
・OS のメモリキャッシュをクリアする(http://futuremix.org/2009/09/clear-linux-memory-cach)
・Swap が少なすぎる気がするので、少なくても実メモリと同等ぐらいに拡張する

でしょうか。

Swap は、RedHatの推奨として「8GB」程度のようですね。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/ch-swapspace.html

投稿2016/04/21 17:18

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

izayoi136

2016/04/22 00:49

hyper-drums-ko様 ご回答有難う御座います。 >・ServerLimit と MaxClients の値を50ぐらいに減らす  検討させて頂きます。 >・大きなデータを扱う処理がないのであれば、php.ini の memory_limit を 8~16MBぐらいで設定する  こちらも検討します。  memory_limitは少し余裕を持たせて現在40MBを設定しています。 >・OS のメモリキャッシュをクリアする(http://futuremix.org/2009/09/clear-linux-memory-cach)  メンテナンスに行います。   >・Swap が少なすぎる気がするので、少なくても実メモリと同等ぐらいに拡張する  こちら近日対応致します。  なるべくエラー通知や機能障害が出てしまうものは避けたいと考えております、プログラムは一見正常に動いているように見える為、社内の理解を得られにくく、ご提案を保留にさせて頂く事を申し訳なく思っています。とても感謝しています。 出来るだけの手は尽くさせて頂きます。
guest

0

おもいつきですが…
子プロセスを1こづつ順繰りにkillするのは無しですかね。(^_^;

投稿2016/04/21 13:55

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

izayoi136

2016/04/21 14:14

takasima20様 ご回答有難う御座います。 その場合は閲覧ユーザのリクエスト処理中に切断され、閲覧が突然途切れたり、Postしていたらデータならなくなってしまうかと思います。 通常の処理のようにリクエストが終わる形が理想です。 考えて下さって有り難いです。 障害が起こっているので最近は利用者が少ない深夜に takasima様のご提案のように 全てのWEBプロセスをコマンドで殺してからApacheを起動させています。 (・・・帰れない。)
takasima20

2016/04/21 14:22

killってのは半分冗談ですが… 上の記事では、子プロセスで受けられるリクエストを制限して (クライアントに影響なく)子プロセスを再起動しよう って話が書いてあります。
izayoi136

2016/04/21 14:23

takasima20様 >MaxRequestsPerChildを使うという記事がありました。 >http://kimihiro-n.appspot.com/show/5893431851220992 MaxRequestsPerChild 30 を設定しており、機能は上手く働いて20秒ほどでプロセスが終わり。また生まれます。 問題は新しく生成されたプロセスに以前のメモリの値が継承されて、VIRTとRESが少しずつ増加していく現象に悩まされています。 検索までして下さり感謝しています。 ※もっと記事の前方にコンフィグは書くべきでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問