Hi Larry,

>From my understanding this is correct, except the part about the code
history: I am not sure what PHP did in the past (before the new streams
API), so before saying that it was always this way, you should review
ext/std/file.c and main/streams.c in the GIT/SVN/CVS history! But the other
notes seem to be the reason for the "persistent urban legends" :-)

Uwe

P.S.: By the way, I will have a MMap blog post, too; focusing on the same
urban legends about to the use of Lucene's MMapDirectory in Apache Lucene
and Apache Solr. I am just a little bit overcrowded with work.
-----
Uwe Schindler
theta...@php.net - http://www.php.net
NSAPI SAPI developer
Bremen, Germany


> -----Original Message-----
> From: Larry Garfield [mailto:la...@garfieldtech.com]
> Sent: Monday, April 30, 2012 7:16 PM
> To: internals@lists.php.net
> Subject: Re: [PHP-DEV] readfile() memory usage
> 
> Thanks all.  So it sounds like the answer is:
> 
> 1) readfile() has always been memory-safe as far as PHP is concerned.
> 2) Because it uses mmap(), GFL trying to understand its memory usage from
> top.
> 3) Operating systems have gotten better at such things in the past decade.
> 4) So given #2 and #3, the "readfile() will kill your memory, don't use
it" line is
> a persistent urban legend that belongs on Snopes as debunked.  Looping on
> fread() for performance is a red herring.
> 
> Is that an accurate summary?  If so, I will blog my benchmark results and
this
> conversation.
> 
> --Larry Garfield
> 
> On 4/30/12 5:33 AM, Sherif Ramadan wrote:
> >> Mmapping of course uses memory, but the memory used here is not from
> >> PHP's memory manager, it's memory that's already used for the O/S
> >> cache. The memory mapping used here does not enforce loading the file
> >> contents into O/S cache; it just gets a virtual address into the O/S
> >> cache. If the actual file contents are not yet in O/S cache, the O/S
> >> will hit a page fault and load the pages into memory. Apache Server
uses
> the same mechanism to serve files.
> >>
> >> Maybe the "user confusion" about memory usage comes from that fact
> >> (they see lots of *virtual* memory used by PHP when viewed in top). I
> >> know this user confusion from my work in the Apache Lucene/Solr
> >> project, where one option (used on 64 bit operating systems) is to
> >> memory-map the whole Lucene full-text index. Users then see hundreds of
> Gigabytes of "virtual memory"
> >> usage in TOP / Windows Task Manager and are afraid of running their
> >> machine out of memory. This is always hard to explain to people that
> >> are not used to the term "virtual memory".
> >>
> >
> >
> > That's a very good point and a detailed look at the stack can show
> > some of the underlying mechanics coming from readfile and how its
> > pretty much is just implemented like fpassthru delegating a stream, as
> > you said.
> >
> > http://i.imgur.com/PWiTv.png
> >
> >
> >>
> >>> About php memory usage, one has to use an external tools to actually
> >>> see
> >> this
> >>> memory usage as it is not managed by the zend memory manager.
> >>
> >> Of course...
> >>
> >
> > Also, running valgrind and taking a closer look at what memory blocks
> > PHP is allocating here it can be better determined what's leaking and
> > what isn't, of course...
> >
> > http://pastebin.com/LSQcUsBL
> >
> >
> > I can certainly attest to users being deceived by memory readings in
> > top in the past. It can be very deceiving if you think look at what
> > free memory top or `free` shows you especially after some huge
> > allocation. There's a clear difference here though between the Zend
> > memory manager allocating these blocks in PHP and what's going on with
> > readfile. The memory the system knows is available to it isn't being
> > tied up in this case.
> >
> 
> --
> PHP Internals - PHP Runtime Development Mailing List To unsubscribe,
visit:
> http://www.php.net/unsub.php


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to