Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

商品・受注・顧客などのCSVダウンロードでメモリ不足エラー。 #4775

Closed
belltzel opened this issue Nov 27, 2020 · 9 comments
Milestone

Comments

@belltzel
Copy link
Contributor

belltzel commented Nov 27, 2020

概要(Overview)

受注CSVダウンロードするとデータが途中までしかダウンロードできない。

原因として

@trigger_error('The '.__METHOD__.' method is deprecated.', E_USER_DEPRECATED);

@trigger_error('The '.__METHOD__.' method is deprecated.', E_USER_DEPRECATED);

2か所の「trigger_error」がメモリにログをため込んでいる模様。
処理が終わった時にため込んだログが「var/log/prod/****.log」へ書き込まれる。

テストデータ(受注データ800件)ほどで全件受注CSVをDLした結果、16Mほどのログが出力される。
(DL処理が途中で終わる。)
内容は下記のような感じ。

2020-11-27_12h49_54

trigger_errorをコメントアウトすれば、メモリ不足エラーなく正常にCSVダウンロードが出来る。

期待する内容(Expect) or 要望 (Requirement)

■一つ目の案。
非推奨になっている「EntityUtil::isNotEmpty」の利用停止。
「EntityUtil::isNotEmpty」を利用しない判定へ変更。

利用している箇所は以下の箇所。

if (EntityUtil::isNotEmpty($data)) {

if (EntityUtil::isNotEmpty($elem)) {

■二つ目の案
「EntityUtil::isNotEmpty」が何度も動作する為、trigger_errorを一度だけ動作させるように変更する。

再現手順(Procedure)

受注データを大量に作成。(自分が確認時は800件程度)
受注CSVダウンロードをする。

CSV出力項目は変更していません。(インストール時から変更なし)

環境 (environment)

  • EC-CUBE: 4.0.5
  • PHP: 7.4.10
  • DB:
    • MySQL 5.7.28

関連情報 (Ref)

#4435

@belltzel
Copy link
Contributor Author

助言①
ログレベルの設定で何とかしてみる。

@belltzel
Copy link
Contributor Author

belltzel commented Nov 28, 2020

最小限での設定変更でメモリ不足エラーを回避する方法。

monolog.yamlファイルの修正
https://github.com/EC-CUBE/ec-cube/blob/4.0/app/config/eccube/packages/prod/monolog.yml

main:
front:
admin:
の「action_level」を「error」から「info」へ変更する。
CSVダウンロードが最後までダウンロード出来ている事を確認。

「type: fingers_crossed」は「action_level」の設定されたレベル以上のエラーが出るまでログが蓄積される。

なので、CSVダウンロード時は、infoレベルの「E_USER_DEPRECATED」が蓄積され続けるためメモリオーバーになる。
「action_level」をinfoに変更すれば、infoレベル以上がログファイルに都度書き込まれるので、メモリが消費されない。

■問題
CSVダウンロードするデータが多くなればそれに比例してログ出力が増えるてしまう。
1回のダウンロードで数十M~数百M。。。それ以上になる場合もある。
(検証時は800件程度の受注データで、項目はデフォルト)

@chihiro-adachi
Copy link
Contributor

@belltzel
メモリ食ってるのは主にmonologという理解であってます?

@belltzel
Copy link
Contributor Author

belltzel commented Dec 3, 2020

@chihiro-adachi

現在の設定では、エラーを溜めて処理終了後(正常でもエラー中断でも)に溜めたログをファイルに出力されてます。
使用メモリは常に増え続けてました。

上記のコメントのようにaction_levelをerrorからinfo(E_USER_DEPRECATEDがinfoレベル)へ変更することで、CSV出力の処理中に「E_USER_DEPRECATED」のエラーがログへ出力(ログを溜めない)されてるので、使用メモリが増えずに正常に処理が終了します。

phpiniでerror_reportingなども設定いじってみましたが、改善ありませんでした。

上記の事からmonologがメモリを食ってる理解で間違いないと思います。

@chihiro-adachi
Copy link
Contributor

@belltzel
ありがとうございます。

monologの設定を動的に変更できればよさそうですね。
自分の方でも少しみてみます。

@chihiro-adachi
Copy link
Contributor

@belltzel
#4814 で、CSV出力時のログ出力無効化の実装を入れてみたのですがこれで改善されますでしょうか。

@belltzel
Copy link
Contributor Author

@chihiro-adachi

ご対応ありがとうございます!!

受注CSVダウンロードの部分にも入れてみましたが、問題なくCSVのダウンロードが出来ました!!

@chihiro-adachi
Copy link
Contributor

@belltzel
ご確認ありがとうございます!
他の箇所にも修正適用しておきます。

@chihiro-adachi
Copy link
Contributor

@belltzel
最終的に #4815 の修正方法で対応していますのでご確認おねがいできればと思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants