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

[8.x] Free reserved memory before handling fatal errors #42630

Merged
merged 1 commit into from
Jun 2, 2022
Merged

[8.x] Free reserved memory before handling fatal errors #42630

merged 1 commit into from
Jun 2, 2022

Conversation

spawnia
Copy link
Contributor

@spawnia spawnia commented Jun 2, 2022

Free reserved memory before handling fatal errors

When the PHP process exceeds the configured memory limit,
a fatal error such as the following occurs:

Allowed memory size of 1073741824 bytes exhausted (tried to allocate 3358976 bytes)

Currently, the process abruptly exits in such cases without
and indication as to what has caused the error. This is
because the handler from register_shutdown_function()
attempts to instantiate a FatalError instance, thus trying
to use memory that is not available.

This clears the reserved memory before this instantiation,
thus ensuring that the process has enough memory to
properly handle the error. Reserved memory is also cleared
in handleException in the same way.

When the PHP process exceeds the configured memory limit,
a fatal error such as the following occurs:

```
Allowed memory size of 1073741824 bytes exhausted (tried to allocate 3358976 bytes)
```

Currently, the process abruptly exits in such cases without
and indication as to what has caused the error. This is
because the handler from `register_shutdown_function()`
attempts to instantiate a `FatalError` instance, thus trying
to use memory that is not available.

This clears the reserved memory before this instantiation,
thus ensuring that the process has enough memory to
properly handle the error. Reserved memory is also cleared
in `handleException` in the same way.
@spawnia spawnia changed the title Free reserved memory before handling fatal errors [8.x] Free reserved memory before handling fatal errors Jun 2, 2022
@taylorotwell taylorotwell merged commit 5094350 into laravel:8.x Jun 2, 2022
@spawnia spawnia deleted the handle-memory-size-exhausted branch June 2, 2022 14:52
taylorotwell added a commit that referenced this pull request Jun 3, 2022
* Increase reserved memory for error handling

Follow up to #42630

The error handler should be able to report exceptions
arising from exceeding the PHP memory limit. Because
of changes made to error handling, the previously
configured value is no longer sufficiently large.

A similar change was also done in Symfony a while ago,
see symfony/symfony#44327.

I used the following artisan command to determine the amount
of memory required for error handling, using a reporter that
simply writes to a file:

```php
<?php declare(strict_types=1);

namespace App\Console\Commands;

use Illuminate\Console\Command;

final class MeasureHandlerMemory extends Command
{
    protected $signature = 'measure-handler-memory';

    private int $peak;

    public function handle(): void
    {
        $this->peak = memory_get_peak_usage();

        trigger_error('', E_USER_ERROR);
    }

    public function __destruct()
    {
        $used = memory_get_peak_usage() - $this->peak;
        echo "error handling used: " . $used . "\n";

        $before = memory_get_usage();
        $times = 10240;
        $reserve = str_repeat('x', $times);
        $after = memory_get_usage() - $before;
        echo 'repeat times ' . $times . ' reserves: ' . $after . "\n";

        $ratio = $after / $times;
        echo 'ratio between bytes and repeat: ' . $ratio . "\n";

        echo 'minimum times to repeat: ' . $used / $ratio . "\n";
    }
}
```

* Free memory in HandleExceptions::handleShutdown()

While validating the effectiveness of #42630
in our application, I found that the call `$error = error_get_last()`
causes a tiny bit of memory usage. Thus, I think it is better
to clear memory as soon as entering the handler.

* Update HandleExceptions.php

Co-authored-by: Taylor Otwell <[email protected]>
chu121su12 pushed a commit to chu121su12/framework that referenced this pull request Jun 6, 2022
* Increase reserved memory for error handling

Follow up to laravel#42630

The error handler should be able to report exceptions
arising from exceeding the PHP memory limit. Because
of changes made to error handling, the previously
configured value is no longer sufficiently large.

A similar change was also done in Symfony a while ago,
see symfony/symfony#44327.

I used the following artisan command to determine the amount
of memory required for error handling, using a reporter that
simply writes to a file:

```php
<?php declare(strict_types=1);

namespace App\Console\Commands;

use Illuminate\Console\Command;

final class MeasureHandlerMemory extends Command
{
    protected $signature = 'measure-handler-memory';

    private int $peak;

    public function handle(): void
    {
        $this->peak = memory_get_peak_usage();

        trigger_error('', E_USER_ERROR);
    }

    public function __destruct()
    {
        $used = memory_get_peak_usage() - $this->peak;
        echo "error handling used: " . $used . "\n";

        $before = memory_get_usage();
        $times = 10240;
        $reserve = str_repeat('x', $times);
        $after = memory_get_usage() - $before;
        echo 'repeat times ' . $times . ' reserves: ' . $after . "\n";

        $ratio = $after / $times;
        echo 'ratio between bytes and repeat: ' . $ratio . "\n";

        echo 'minimum times to repeat: ' . $used / $ratio . "\n";
    }
}
```

* Free memory in HandleExceptions::handleShutdown()

While validating the effectiveness of laravel#42630
in our application, I found that the call `$error = error_get_last()`
causes a tiny bit of memory usage. Thus, I think it is better
to clear memory as soon as entering the handler.

* Update HandleExceptions.php

Co-authored-by: Taylor Otwell <[email protected]>
chu121su12 pushed a commit to chu121su12/framework that referenced this pull request Jun 6, 2022
When the PHP process exceeds the configured memory limit,
a fatal error such as the following occurs:

```
Allowed memory size of 1073741824 bytes exhausted (tried to allocate 3358976 bytes)
```

Currently, the process abruptly exits in such cases without
and indication as to what has caused the error. This is
because the handler from `register_shutdown_function()`
attempts to instantiate a `FatalError` instance, thus trying
to use memory that is not available.

This clears the reserved memory before this instantiation,
thus ensuring that the process has enough memory to
properly handle the error. Reserved memory is also cleared
in `handleException` in the same way.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants