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

[Cache] fix memory leak when using PhpArrayAdapter #34839

Merged
merged 1 commit into from Dec 7, 2019

Conversation

nicolas-grekas
Copy link
Member

Q A
Branch? 3.4
Bug fix? yes
New feature? no
Deprecations? no
Tickets Fix #34687
License MIT
Doc PR -

Thanks to @adrienfr, I've been able to understand what causes this massive memory leak when using PhpArrayAdapter:
image

When tests run, a new kernel is booted for each test case. This means a new instance of PhpArrayAdapter is created, which means it loads its state again and again using include for e.g. annotations.php in this example.

The first obvious thing is that we see this doing compile::*: this means PHP is parsing the same file again and again. But shouldn't opcache prevent this? Well, it's disabled by default because opcache.enable_cli=0. To prove the point, here is a comparison with the same tests run with php -dopcache.enable_cli=1. The comparison is swapped, but you'll get it:

image

But that's not over: because of https://bugs.php.net/76982 (see #32236 also), we still have a memory leak when the included file contains closures. And this one does.

This PR fixes the issue by storing the return value of the include statement into a static property. This fits the caching model of PhpArrayAdapter: it's a read-only storage for system caches - i.e. its content is immutable.

@fabpot
Copy link
Member

fabpot commented Dec 7, 2019

Thank you @nicolas-grekas.

fabpot added a commit that referenced this pull request Dec 7, 2019
…s-grekas)

This PR was merged into the 3.4 branch.

Discussion
----------

[Cache] fix memory leak when using PhpArrayAdapter

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #34687
| License       | MIT
| Doc PR        | -

Thanks to @adrienfr, I've been able to understand what causes this massive memory leak when using `PhpArrayAdapter`:
![image](https://user-images.githubusercontent.com/243674/70262187-303b1b00-1794-11ea-9fcb-21ae29c31ff0.png)

When tests run, a new kernel is booted for each test case. This means a new instance of `PhpArrayAdapter` is created, which means it loads its state again and again using `include` for e.g. `annotations.php` in this example.

The first obvious thing is that we see this doing `compile::*`: this means PHP is parsing the same file again and again. But shouldn't opcache prevent this? Well, it's disabled by default because `opcache.enable_cli=0`. To prove the point, here is a comparison with the same tests run with `php -dopcache.enable_cli=1`. The comparison is swapped, but you'll get it:

![image](https://user-images.githubusercontent.com/243674/70262616-fb7b9380-1794-11ea-81c3-6fea0145a63b.png)

But that's not over: because of https://bugs.php.net/76982 (see #32236 also), we still have a memory leak when the included file contains closures. And this one does.

This PR fixes the issue by storing the return value of the include statement into a static property. This fits the caching model of `PhpArrayAdapter`: it's a read-only storage for system caches - i.e. its content is immutable.

Commits
-------

4194c4c [Cache] fix memory leak when using PhpArrayAdapter
@fabpot fabpot merged commit 4194c4c into symfony:3.4 Dec 7, 2019
@damienalexandre
Copy link
Contributor

@nicolas-grekas I confirm this fix the memory issue I had in my tests!

Before I had this with the disableReboot trick to avoid the leak (without it I hit the memory limit):

Time: 1.91 minutes, Memory: 173.00MB

I now have this, without the disableReboot 🎉

Time: 2.31 minutes, Memory: 89.00MB

Congrats!

@nicolas-grekas nicolas-grekas deleted the cache-memleak branch December 9, 2019 11:02
nicolas-grekas added a commit that referenced this pull request Dec 10, 2019
…s-grekas)

This PR was merged into the 4.3 branch.

Discussion
----------

[Cache] fix memory leak when using PhpFilesAdapter

| Q             | A
| ------------- | ---
| Branch?       | 4.3
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #34687
| License       | MIT
| Doc PR        | -

Similar to #34839 but for `PhpFilesAdapter`, as the "appendOnly" mode is a v4-only feature.

Commits
-------

0b46226 [Cache] fix memory leak when using PhpFilesAdapter
This was referenced Dec 19, 2019
This was referenced Jan 21, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants