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

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

ただいまの
回答率

90.48%

  • PHP

    20870questions

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

  • Apache

    1871questions

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

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 7,885

izayoi136

score 11

前提・実現したいこと

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 httpdApache再起動直後の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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+1

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/25 15:38

    chun様

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/21 23:25

    ご回答の内容には同意です。

    ただ、
    > 週に一度の対応で良いはず

    については、
    「リークしたメモリが1MBに達するのが約1週間」
    という計算をされていませんか?

    質問者様の要望は
    > Apacheの全体メモリ(*)を1GB程度で抑えて
     * つまり、リーク部分以外のメモリもあわせて

    ということかと思いますので、実際はもっと頻繁に対応する必要があるはずです。

    キャンセル

  • 2016/04/22 01:32

    te2ji様


    >根本原因の調査に力を入れられてはいかがですか?

    言い訳がましくなりますが
    プログラムの改修は予算がつかず対応が難しい状態で。一度リリースさされてしまうと、別会社への予算がとてもつきにくいのです。またメモリリークは探すのが困難であり、サーバー側で対症療法でなんとかならないかあがいている状態です。

    >週に一度の対応で良いはずなので、根本原因の調査に力を入れられてはいかがですか?
     1日におよそ70MB増加しており、なんとか凌げないこともないのかなと考えています。現在は安全の為2日に一度深夜にWEBサーバをリブートしております。
     



    キャンセル

  • 2016/04/22 01:34

    te2ji様

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

    キャンセル

  • 2016/04/22 01:42

    KiyoshiMotoki 様

    > Apacheの全体メモリ(*)を1GB程度で抑えて
    >* つまり、リーク部分以外のメモリもあわせて
    >ということかと思いますので、実際はもっと頻繁に対応する必要があるはずです。

    Apache全体の使用メモリが1GBを超えたあたりでロードアベレージがかかり、不安定になります。また、2GBに達した時にSWAPを食い出し、一部機能がシステムダウンを起こしてからは1~2日に一度深夜に私がリブート対応しています。

    皆様にお知恵を貸して頂いて有り難いです。

    キャンセル

  • 2016/04/22 01:42

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

    となると、あまりお役に立てることがなく、申し訳ないです^^;

    キャンセル

  • 2016/04/22 01:49

    te2ji様

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/21 23:08

    MaxRequestsPerChildを使うという記事がありました。

    http://kimihiro-n.appspot.com/show/5893431851220992

    キャンセル

  • 2016/04/21 23:14

    takasima20様

    ご回答有難う御座います。
    その場合は閲覧ユーザのリクエスト処理中に切断され、閲覧が突然途切れたり、Postしていたらデータならなくなってしまうかと思います。
    通常の処理のようにリクエストが終わる形が理想です。
    考えて下さって有り難いです。

    障害が起こっているので最近は利用者が少ない深夜に
    takasima様のご提案のように
    全てのWEBプロセスをコマンドで殺してからApacheを起動させています。
    (・・・帰れない。)

    キャンセル

  • 2016/04/21 23:22

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

    キャンセル

  • 2016/04/21 23:23

    takasima20様

    >MaxRequestsPerChildを使うという記事がありました。
    >http://kimihiro-n.appspot.com/show/5893431851220992

    MaxRequestsPerChild 30
    を設定しており、機能は上手く働いて20秒ほどでプロセスが終わり。また生まれます。
    問題は新しく生成されたプロセスに以前のメモリの値が継承されて、VIRTとRESが少しずつ増加していく現象に悩まされています。
    検索までして下さり感謝しています。

    ※もっと記事の前方にコンフィグは書くべきでした。

    キャンセル

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/22 09: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 が少なすぎる気がするので、少なくても実メモリと同等ぐらいに拡張する
     こちら近日対応致します。

     なるべくエラー通知や機能障害が出てしまうものは避けたいと考えております、プログラムは一見正常に動いているように見える為、社内の理解を得られにくく、ご提案を保留にさせて頂く事を申し訳なく思っています。とても感謝しています。
    出来るだけの手は尽くさせて頂きます。

    キャンセル

0

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

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

composer require "hoge/fuga"

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20870questions

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

  • Apache

    1871questions

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