Bug #81017 [Opn->Nab]: PharData memory leak

From: Date: Fri, 07 May 2021 11:41:22 +0000
Subject: Bug #81017 [Opn->Nab]: PharData memory leak
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-233724@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=81017&edit=1 ID: 81017 Updated by: cmb@php.net Reported by: jon dot johnson at ucsf dot edu Summary: PharData memory leak -Status: Open +Status: Not a bug Type: Bug Package: PHAR related Operating System: PHP Docker / OSX 10.15.7 PHP Version: 8.0.5 -Assigned To: +Assigned To: cmb Block user comment: N Private report: N New Comment: The memory "leak" is the phar_fname_map[1] which holds one entry per PharData used during the request, and is only released at the end of the request. So there is no memory leak; it's just a caching mechanism. > PHP exits with status 137. That's due to the infinite loop in Metrics::summary() (which looks like a userland bug) hitting a timeout. [1] <https://github.com/php/php-src/blob/php-7.4.19/ext/phar/phar_internal.h#L133> Previous Comments: ------------------------------------------------------------------------ [2021-05-06 23:24:07] hanskrentel at yahoo dot de If the filename stays the same per each iteration, there is no further increase and PHP exits with status 137. PHP also exists with status 137 when the directory entry is deleted right after it was added. Memory stays low then, too. The behaviour is since the existence of PharData. 100 runs each, across more php versions with summaries at the bottom: * 100 file names: https://3v4l.org/lGa2n * 1 file name: https://3v4l.org/8GaSb (Exit status 137) * 100 file names, directory entry deleted: https://3v4l.org/OqGCY (Exit status 137) most common memory offset per file (~94 of 100 times): PHP 8 (all versions): 12928 PHP 7 (all versions): 12960 PHP 5 (5.4 - 5.6) : 3032 PHP 5.3 : 3192 ------------------------------------------------------------------------ [2021-05-06 18:57:35] jon dot johnson at ucsf dot edu Description: ------------ When working with a tar file using PharData memory increases and is not released. I first noticed this when using PharData::extractTo(), but it is more easily reproduced with PharData::addEmptyDir() as I've done below. It seems to be relative to to the size fo the archive, but I didn't confirm this. Seems to exist in all versions of PHP, tested with: docker container run --rm -v $(pwd):/test/ php:5-cli php /test/test.php docker container run --rm -v $(pwd):/test/ php:7-cli php /test/test.php docker container run --rm -v $(pwd):/test/ php:8-cli php /test/test.php and got the same result. Test script: --------------- <?php echo 'Start: ' . memory_get_usage() . "\n\n"; for ($i = 0; $i < 10; $i++) { $path = __DIR__ . DIRECTORY_SEPARATOR . $i . '.tar'; $phar = new PharData($path); $phar->addEmptyDir('test'); unset($phar); unlink($path); echo "After ${i}: " . memory_get_usage() . "\n"; } gc_collect_cycles(); echo "\nEnd: " . memory_get_usage() . "\n"; Expected result: ---------------- I would expect each iteration fo the loop to be self contained (even without the manual steps to unset and unlink) and that memory consumption would be constant for this script no matter how many iterations were run. Actual result: -------------- php test.php Start: 398248 After 0: 411936 After 1: 424968 After 2: 438000 After 3: 451032 After 4: 464064 After 5: 477096 After 6: 490128 After 7: 503160 After 8: 516512 After 9: 529544 End: 529504 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=81017&edit=1

« previous php.bugs (#233724) next »