唐突にphpのメモリが超過するバグが発生。Core Version -5.7.5.13

2020年7月17日 at 0:46

Concrete5を用いて複数の会社のサイトを運営しております。そのうち5.7.5.13のバージョンを用いているサイトが突如、一部ページは見れるものの一部ページはphpのメモリ超過エラーが発生し閲覧できない事象が発生しました。またサイト全体が重くなってしまっています。

この現象は7月17日に唐突に発生しました。ssl_errologに突如として以下の様なエラーが出力されました。

[Thu Jul 16 20:01:25 2020] [error] [client xxxxxx] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 918016 bytes) in /documentroot/concrete/src/Support/Facade/Database.php on line 22, referer: XXXXXXXX

[Thu Jul 16 20:02:43 2020] [error] [client xxxxxx] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 917504 bytes) in /documentroot/concrete/src/Support/Facade/Database.php on line 22, referer: XXXXXXXXX

[Thu Jul 16 20:03:15 2020] [error] [client xxxxxx] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 924672 bytes) in /documentroot/concrete/src/Support/Facade/Database.php on line 22

[Thu Jul 16 20:03:46 2020] [error] [client xxxxxx] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 915968 bytes) in /documentroot/concrete/src/A
rea/Layout/Preset/Provider/Manager.php on line 37, referer: XXXXXXXXX

[Thu Jul 16 20:03:50 2020] [error] [client xxxxxx] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 918016 bytes) in /documentroot/concrete/src/Support/Facade/Database.php on line 22, referer: XXXXXXXX

concrete以外にapacheやphp、その他のソフトに問題があるかを確かめ対処を行いましたが、閲覧ができないページは依然として残り、最終的に上記のエラーは出力され続けました。

このサーバーでは他のサイト(Concrete5)も管理しており、バーチャルホストで区切っています。そしてphpや他のリソースは共用なので、サーバーに問題があれば他のサイトでも閲覧不可のページは発生します。しかし他のサイトは特にその様な問題はなく、5.7.5.13のサイトのみこのエラーが発生します。

カスタムブロック、独自パッケージの実装などもあるため要因は多岐に渡ると思います。しかし/concrete/src/Support/Facade/Databaseでphpのメモリ超過が繰り返し報告されているのでデータベースに接続するも、無限ループか何かが起きているのでは?データベースに接続するcoreのものか自作の物が影響しているのでは?と思っています。

このエラーは今日いきなり発生し、このサイト自体は5年前から運営して今日までこの様なエラーは発生しませんでした。エラーログよりお客様がこのサイトを一部編集した際に起きたので、予想外の使い方をされたのか?と思いヒアリングをしましたが、ただ記事ブロックを追加しただけとのことで、特に問題はない様な気がします。

もし何か気づきの点がありましたらぜひアドバイス塔お願いします。アメリカのC5フォーラムにも同様の質問を投げようと思っています。

以下サーバーのバージョン等です。

CentOS release 6.8 (Final)
Server version: Apache/2.2.15 (Unix)
PHP 5.4.45 (cli) (built: Aug 23 2016 14:41:13)
mysql 5.7.17
Concrete 5.7.5.13

・一部のページは「待機中」となりずっと見れない。
・静的書き出しなどは行っていない。
・一部のページは見れる。しかし重い
・サイトに複数人がアクセスするとかなり重くなる。最悪、サイトが応答しなくなる。
・ログインは何とかできる。
・ダッシュボードは重いがなんとか動く。サイトマップはシステムページを含めようとすると待機中となってしまう。

・Apacheのエラーログは以下の物が大量に出力される。
Failed loading opcache.so: opcache.so: cannot open shared object file: No such file or directory
[Thu Jul 16 16:51:44 2020] [notice] child pid 12360 exit signal Segmentation fault (11)

タグ:

Re: 唐突にphpのメモリが超過するバグが発生。Core Version -5.7.5.13

2020年7月17日 at 6:40
自作のコードもあるということなので、切り分けが必要と思います。

- サイトデータを他のサーバーに引っ越しても同じ症状になるか → 向上したらサーバーの問題
- サイトキャッシュをクリアするとどうなるか。クリア直後としばらく経ってから変わるか → 変わったら c5 キャッシュに関わる何かが問題
- 特定のページ訪問や特性のアクション後に遅くなるなどあるか → その特定のアクション・カスタマイズが問題
- 管理画面などテーマを使っていないページ訪問中も遅くなるか? → 管理画面が早ければテーマ関連ファイルかブロックなどフロントエンド部分が問題
- ログをクリアするとどうなるか → ログが貯まりすぎていないか



あくまでも参考ですが

concrete5 の GitHub でメモリに関するバグが報告 or 修正されているか Issue や Pull Request を調べてみました。
http://github.com/concrete5/concrete5/issues?page=2&q=is%3Aissue+memory
http://github.com/concrete5/concrete5/pulls?page=2&q=is%3Apr+memory

プルリクエストのところで、5.7.5.13 がリリースされた 2016年12月周辺に、画像に関するメモリリークの修正や機能追加がありました。(5.7.5.13 への修正ではなく、主に V8 への修正追加があります)

すごく巨大な画像ファイルをアップロードし、concrete5 がそのサムネイル画像を作ろうとしてクラッシュしているかもしれません。SVG 画像形式の可能性もあります。SVG 画像は 5.7時代はあまりうまく処理できていませんでした。

JPEG や PNG なご、すごく巨大なファイルサイズでも、真っ白な画像だったり圧縮率がすごく良いために、ファイルサイズは小さいけれども、実際の画像サイズは果てしなく大きいという場合があります。

それが起因しているかもしれません。

一度、最近アップロードされたファイルにそのようなファイルがないか確認してもらえますか?

ありそうであれば、そのファイルを削除してみてください。難しい場合は、小さめのサイズの画像を作り、物理的に画像を差し替えてみてください。

ファイル画像が原因だとすると、根本的な解決は、V8 以降にアップグレードし、アップロード時に JS でユーザーのブラウザ側で一定程度以下にリサイズしてからアップロードする機能をオンにしてもらうのが良いかと思います。
 

Re: 唐突にphpのメモリが超過するバグが発生。Core Version -5.7.5.13

2020年7月17日 at 9:59
ご返信ありがとうございます。

インフラの専門家の方と話し合ったところ、phpの制限を上げてもその制限を食い潰す様にまた超過を起こしているので無限ループや膨大なサイズのファイルを参照しようとしている可能性が示唆されました。

また唐突に起きたので、お客様にもその様どんな操作を行ったかを確認を行っています。

vagrant上にこのサイトの開発環境を構築し、同じapplication/fileとDBを入れ込むと同様のエラーが同じページで発生しました。

vagrantで同様のエラーが発生するのでサーバー由来というよりは、concrete5の自作スクリプトor予想だにしない操作が原因の可能性が高いです。ともかく頂いたアドバイスや専門の方と調査を進め、進展がありましたら追記いたします。
 

Re: 唐突にphpのメモリが超過するバグが発生。Core Version -5.7.5.13

2020年7月17日 at 12:06
なんとかサイトは閲覧できるようになりました。ログを確認してみると

[Fri Jul 17 01:06:48 2020] [error] [client xxxxxxxxxx] PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 2101248 bytes) in /documentroot/concrete/src/Area/Layout/Preset/Provider/Manager.php on line 37

と見られ、エリアプリセットもエラーを吐いていました。このコア部分の

$presets = array();
foreach($this->providers as $provider) {
//$presets = array_merge($presets, $provider->getPresets());
}

上記箇所にコメントアウトすることでバグが起きなくなりました。(コアをいじるのはご法度ですが...)

しかしエリアプリセットを使えなくしたので、「記事+画像横並び」みたいなレイアウトが崩れて全て縦並びになってしまいました。お客様にはサイトがとりあえず見れるので今のところは大丈夫とのことで、引き続きテーマファイルなどを見直しています。

CMSによるページ編集は禁止にして、エリアプリセットのバグの対処にあたります。ファイルアップロード系のご指摘に感してお客様に尋ねましたが、該当するようなことは行っておりませんでした。アドバイスありがとうございました。

引き続きエリアプリセットあたりのエラーの究明、テーマコントローラーでのエリアプリセットをvagrant上で確認します。

このエリアプリセットあたりに今回のようなバグが発生したというissueやpull request、他のフォーラムではありますか?(念のため英語版の方でも投稿します。)