Bug #80108 [ReO]: APACHE+PHP not releasing memory in certain conditions on Win10

From: Date: Wed, 16 Sep 2020 20:20:44 +0000
Subject: Bug #80108 [ReO]: APACHE+PHP not releasing memory in certain conditions on Win10
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-229030@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=80108&edit=1 ID: 80108 Updated by: nikic@php.net Reported by: gilperon at gmail dot com Summary: APACHE+PHP not releasing memory in certain conditions on Win10 Status: Re-Opened Type: Bug Package: *General Issues Operating System: * PHP Version: 7.4.10 Block user comment: N Private report: N New Comment: Try gc_mem_caches(). Previous Comments: ------------------------------------------------------------------------ [2020-09-16 20:18:35] gilperon at gmail dot com Someone told me at SO to use: gc_enable(); gc_collect_cycles(); However, even after using it, no memory is released. So how do I force Zend to release the cache/memory? ------------------------------------------------------------------------ [2020-09-16 13:44:46] gilperon at gmail dot com Wow, by the votes, some other people reported the same issue! Great, hope some responsible non-sarcastic voluntary of PHP project can fix this. As I said, I know how memory management/leak work, but I have 0 idea how PHP source code was implemented. It would take me months to study PHP code only to fix this bug, so yeah, better hope that some good responsible person, that already knows inner workings of PHP, decide to fix this, or at least take a close look instead of just saying "this is expected behaviour, deal with it". @cmb@php.net this is not expected, mainly if you have a server that gets thousands of requests like this. It will trash the RAM in seconds. ------------------------------------------------------------------------ [2020-09-16 09:37:15] cmb@php.net This is expected behavior. On request shutdown, the Zend memory manager does not free all allocated chunks, but rather retains some[1] to avoid the need to reallocate them possibly for the next request. That does not imply, that there are no real memory leaks in PHP, but the given test script does not show any. [1] <https://github.com/php/php-src/blob/php-7.4.10/Zend/zend_alloc.c#L2273> ------------------------------------------------------------------------ [2020-09-16 06:57:03] sjon@php.net > I know how memory leak works, how memory management works, variable lifecycle, stacks... So I > came up with the minimum code to show you this bug. > I am pretty sure PHP is doing something weird on the background which is not cleaning cache or > any memory assigned location. that's pretty awesome, you have a reproducible issue and the knowledge to fix it! :) In case you haven't noticed yet, we are an open-source project and the full sourcecode can be found here: https://github.com/php/php-src/tree/php-7.4.10/sapi/apache2handler If the votes are any indication, there are more people experiencing this issue; meaning you can help fix this issue for others as well. We welcome your pull-request! ------------------------------------------------------------------------ [2020-09-15 22:33:09] gilperon at gmail dot com Description: ------------ I am running latest APACHE (2.5.x) + PHP (7.x) on my Win10 computer which has 8GB of RAM. All configurations are default. When I start my Apache and check Windows Task Manager it shows the two Apache processes are using about 5 to 6 MB of RAM. Great. Now I saved the code below on a test.php file and execute it using my browser like this http://localhost/test.php The contents of that file is pretty simple, just this: <?php set_time_limit(0); ini_set("memory_limit","-1"); $temp = str_repeat("ffkl2kfj\nflkdsjf \rflksdjfldskjLJFDSL djsk|fhgjk{}fkgkjfdk",10000000); explode("|",$temp); echo "ended"; ?> After executing the code above and waiting till it shows ended, one of my Apache processes shows 400MB of RAM being consumed (the other Apache process is with 5-6MB of RAM). If I execute that code again, Apache will consume 700MB. Then again, it will show 850MB and so on. That's the bug itself. I know how memory leak works, how memory management works, variable lifecycle, stacks... So I came up with the minimum code to show you this bug. NOW what is impressive, if that if after you call a few times the file test.php on your browser, if you create another file named test2.php with the contents being only <?php echo "x"; ?>, and if you execute that same file using your browser, you will see Apache memory usage drops to exactly HALF! Now execute it again, Apache`s consumed RAM will drop again exactly by 50%... and so on. Keep doing this until it reaches 5-6MB and it will stop dropping. What is going on? This is a big problem to me and the only "escape" is creating scheduled task to restart Apache every 12 hours. I need to fix this cause in this computer I run a small webservice to a few friends and every once in a while Apache reaches almost 100% of memory usage and I need to restart it manually, even this webservice receiving no more than 10 or 20 requests a day. For some reason, Apache is not completely cleaning its memory after each request. I know I should be using a linux distro (like Centos 8.x that I run on a VPS) if I want to run a realiable LAMP stack, but this bug is still pretty weird. I am pretty sure PHP is doing something weird on the background which is not cleaning cache or any memory assigned location. Test script: --------------- <?php set_time_limit(0); ini_set("memory_limit","-1"); $temp = str_repeat("ffkl2kfj\nflkdsjf \rflksdjfldskjLJFDSL djsk|fhgjk{}fkgkjfdk",10000000); explode("|",$temp); echo "ended"; ?> Expected result: ---------------- Memory should be released as soon the request was finished. Actual result: -------------- Memory is not being cleaned. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=80108&edit=1

« previous php.bugs (#229030) next »