Bug #51523 [Opn->Csd]: Memory leak on fread()

[email protected] ("evilzluk at gmail dot com") Sat, 10 Apr 2010 20:24:07 +0200 (CEST)
Newsgroups php.bugs
Message-ID <[email protected]>
Edit report at http://bugs.php.net/bug.php?id=51523&edit=1

 ID:               51523
 User updated by:  evilzluk at gmail dot com
 Reported by:      evilzluk at gmail dot com
 Summary:          Memory leak on fread()
-Status:           Open
+Status:           Closed
 Type:             Bug
 Package:          Performance problem
 Operating System: Linux
 PHP Version:      Irrelevant

 New Comment:

resolved adding to cronjob:
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
sync


Previous Comments:
------------------------------------------------------------------------
[2010-04-10 17:05:17] evilzluk at gmail dot com

Description:
------------
The problem is the fread() uses a normal amount of a memory. But there
are too many unallocated anonymous memory pages.
So if the file size >2G the script may cause eating up to 2G of RAM. But
the script's runtime memory is 5M.

The problem is occured even if:
$fp = fopen($file, "rb");
while(!feof($fp))
    fread($fp, 1024);
fclose($fp);

After that the memory isn't released so we have a garbadge in the
memory.


Test script:
---------------
<?php

$file = "A.very.big.file.avi";
ob_start();
$fp = fopen($file, "rb");
if ($fp)
{
    while(!feof($fp))
    {
        echo(fread($fp, 1024));
        if (ob_get_length())
        {
            ob_flush();
            flush();
            ob_end_flush();
        }
    }
    fclose($fp);
}
@ob_flush();
@flush();
@ob_end_flush();
@ob_end_clean();

?>


Expected result:
----------------
The total amount of a memory usage should be at least <php script
runtime memory usage> + 1024 (+ some buffer (up to 8192)). But not
almost all the physical memory (0...unlimited)

------------------------------------------------------------------------
[2010-04-10 01:06:50] evilzluk at gmail dot com

Description:
------------
The problem is the fread() uses a normal amount of a memory. But there
are too many unallocated anonymous memory pages.
So if the file size >2G the script may cause eating up to 2G of RAM. But
the script's runtime memory is 5M.

The problem is occured even if:
$fp = fopen($file, "rb");
while(!feof($fp))
    fread($fp, 1024);
fclose($fp);

After that the memory isn't released so we have a garbadge in the
memory.


Test script:
---------------
<?php

$file = "A.very.big.file.avi";
ob_start();
$fp = fopen($file, "wb");
if ($fp)
{
    while(!feof($fp))
    {
        echo(fread($fp, 1024));
        if (ob_get_length())
        {
            ob_flush();
            flush();
            ob_end_flush();
        }
    }
    fclose($fp);

    @ob_flush();
    @flush();
    @ob_end_flush();
    @ob_end_clean();
}
?>


Expected result:
----------------
The total amount of a memory usage should be at least <php script
runtime memory usage> + 1024 (+ some buffer (up to 8192)). But not
almost all the physical memory (0...unlimited)





------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=51523&edit=1