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

プラグインのインストールに失敗する問題 #4142

Open
chihiro-adachi opened this issue Apr 19, 2019 · 16 comments

Comments

Projects
None yet
4 participants
@chihiro-adachi
Copy link
Contributor

commented Apr 19, 2019

概要(Overview)

プラグインのインストール時に高負荷な状態が発生し、OOM Killerでhttpdのプロセスが殺される。そのため、プラグインのインストールが完了しない。

発生時のログは以下の通り。

/var/log/messages

Apr 17 09:57:43  kernel: Out of memory: Kill process 16845 (httpd) score 149 or sacrifice child
Apr 17 09:57:43  kernel: Killed process 16845 (httpd) total-vm:2333820kB, anon-rss:524704kB, file-rss:1400kB, shmem-rss:556kB
Apr 17 09:57:47  kernel: swap_info_get: Bad swap offset entry 0008007c
Apr 17 09:57:47  kernel: swap_info_get: Bad swap offset entry 0008007d

主に以下の2点で、高負荷となっている

  • Composer APIによる依存関係の解決
  • symfonyのDIコンテナキャッシュの削除と再生成

インストールに失敗した場合、インストール途中のプラグインファイルや、autoloaderのクラスマップ等が中途半端に残ってしまう。現状では復旧の手順が確立していない。

環境 (environment)

  • EC-CUBE: 4.0.x
  • PHP: 7.x.x
  • DB:
    • PostgreSQL x.x.x
    • MySQL x.x.x

関連情報 (Ref)

  • #3990
  • #4133, #4106
  • BoltやMagentoでもComposerAPIを利用しているため、他のCMSも調査

@chihiro-adachi chihiro-adachi added this to the 4.0.x milestone Apr 19, 2019

@tao-s

This comment has been minimized.

Copy link
Contributor

commented Apr 19, 2019

Magentoでは基本コンソールからcomposer叩きますね。管理画面からはやった事ないです。

@nanasess

This comment has been minimized.

Copy link
Contributor

commented Apr 22, 2019

共有でも、さくらのレンタルサーバーでは難なく動くので何故かなと考えていたんですが、FreeBSD を採用しているため、 OOM Killer が走らないからみたいですね🤔

@nanasess

This comment has been minimized.

Copy link
Contributor

commented Apr 22, 2019

bolt の場合、プラグインは独自に composer.json を生成しており、bolt 本体とは別途依存関係の管理をしているようです。
依存関係考慮のスコープが狭いため高速で、本件のような問題は発生しにくい模様

@tao-s

This comment has been minimized.

Copy link
Contributor

commented Apr 22, 2019

そもそも何でこの処理こんな重いんですか?
composerの問題ですか?

@nanasess

This comment has been minimized.

Copy link
Contributor

commented Apr 22, 2019

@tao-s Composer API の問題と Symfony キャッシュ生成の問題ですね

@nobuhiko

This comment has been minimized.

Copy link
Contributor

commented Apr 23, 2019

例えば https://qiita.com/bezeklik/items/f9bc7afc229b5476e822 こういうアプローチでは早くならないんでしょうか?

@nanasess

This comment has been minimized.

Copy link
Contributor

commented Apr 24, 2019

composer のプラグインはいろいろ試してみる価値ありそうですね。高速化するというより、多少遅くなってでも高負荷にならないようなアプローチができればなと。

@chihiro-adachi

This comment has been minimized.

Copy link
Contributor Author

commented Apr 24, 2019

インストールに失敗した場合、インストール途中のプラグインファイルや、autoloaderのクラスマップ等が中途半端に残ってしまう。現状では復旧の手順が確立していない。

こちらについて、 @nanasess に 復旧手順を作成いただきました。
https://qiita.com/nanasess/items/583683eb94947aebea44

これらを実行しても解消されない場合、フィードバックをお願いできればありがたいです。

@nobuhiko

This comment has been minimized.

Copy link
Contributor

commented Apr 24, 2019

並列化出来ればピークメモリは減りそうですよね〜

@nanasess

This comment has been minimized.

Copy link
Contributor

commented Apr 25, 2019

手元の環境に hirak/prestissimo を入れてみましたが、以下のような感じであまり変化無しですね。。。
Memory usage: 496.44MiB (peak: 588.81MiB), time: 50.58s

ダウンロードより、依存関係を解決するためにキャッシュをメモリに読み込んでいるところで、大量のメモリを食ってる感じです。

@tao-s

This comment has been minimized.

Copy link
Contributor

commented Apr 25, 2019

@nanasess 依存関係の解決でそんなメモリ食うのはやっぱ何かおかしいですね。キャッシュにいらん情報まで入ってんのかな?

@nanasess

This comment has been minimized.

Copy link
Contributor

commented Apr 25, 2019

@tao-s Symfony のパッケージが多すぎるのも問題なのかなと。bolt のように、 本体とプラグインの composer.json を分ければ改善される気がします

@nobuhiko

This comment has been minimized.

Copy link
Contributor

commented Apr 26, 2019

@nanasess 確かに全然変わらないですね。

@nobuhiko

This comment has been minimized.

Copy link
Contributor

commented Apr 26, 2019

あれですね
Reading /hoge/eccube4/app/Plugin/.composer/cache/repo/https---repo.packagist.org/provider-zendframework$zend-hydrator.json
って感じで、パッケージのjsonを全部メモリに読み込むのでどうしようもないっすね

@nanasess

This comment has been minimized.

Copy link
Contributor

commented Apr 26, 2019

@nobuhiko Symfony の依存パッケージ多すぎる問題ですね...

@tao-s

This comment has been minimized.

Copy link
Contributor

commented May 23, 2019

PHPで書かれてて、symfony/PHP-FPMの代わりになるReactPHP使ってる変なのを見つけました。
symfonyでコマンド叩いて子プロセスを管理するヤツなんですが、こんな感じで react/child-process 使ってcomposer動かせませんかね?
そしたら最悪OOM Killerで殺されてもそれを検知できるかな?と
https://github.com/php-pm/php-pm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.