On Thu, Apr 15, 2010 at 9:41 AM, Jérôme Loyet <jer...@loyet.net> wrote:

> 2010/4/15 Ferenc Kovacs <tyr...@gmail.com>:
> >
> >
> > On Thu, Apr 15, 2010 at 9:25 AM, Jérôme Loyet <jer...@loyet.net> wrote:
> >>
> >> 2010/4/15 Ferenc Kovacs <tyr...@gmail.com>:
> >> >
> >> >
> >> > On Thu, Apr 15, 2010 at 9:09 AM, Ferenc Kovacs <tyr...@gmail.com>
> wrote:
> >> >>
> >> >>
> >> >> 2010/4/15 Jérôme Loyet <jer...@loyet.net>
> >> >>>
> >> >>> 2010/4/15 滕路遥 <tly.phpf...@gmail.com>:
> >> >>> > We check error log after our server crashed, and we found that php
> >> >>> > heap
> >> >>> > memory is out of limit,
> >> >>> > so I think imagick use emalloc to allocate php heap memory, to
> check
> >> >>> > the
> >> >>> > zend_memory_usage is
> >> >>> > not a method for imagick, other circumstances which occupy huge
> >> >>> > memory
> >> >>> > can
> >> >>> > use this method to
> >> >>> > ensure the system have enough free memory.
> >> >>>
> >> >>> OK,
> >> >>>
> >> >>> one thing I didn't understand is "why should you want check de zend
> >> >>> memory usage when there is a memory_limit parameter in PHP.ini " ?
> >> >>> does'nt it do the same at PHP layer when allocating ?
> >> >>>
> >> >>
> >> >> Obviously you didn't read the original mail, and the links inside:
> >> >>
> >> >>
> >> >>
> http://groups.google.com/group/highload-php-en/browse_thread/thread/1882a3b2257dcc5c/ea73892cea011541?lnk=gst&q=gaochunhui#ea73892cea011541
> >> >>
> >> >> The problem here is that PHP wouldn't free any allocated memory
> untill
> >> >> the process exits, so there's the risk of memory exhaustion if too
> >> >> many PHP processes were running, even though each process wouldn't
> >> >> exceed PHP's memory_limit.
> >> >>
> >> >> My suggestion is more about releasing the allocated memory as soon as
> >> >> possible. That is, this option is similar to "max_requests".
> >> >>
> >> >> PHP-FPM would kill the PHP process if the requests a process handled
> >> >> exceed max_requests, and similarly, PHP-FPM should kill the PHP
> >> >> process whose memory usage exceeds "exit_on_memory_exceeds".
> >> >>
> >> >> So one of your lib (for example imagick) leaks memory, on the long
> run,
> >> >> it
> >> >> will exhaust the memory limit, and will kill a totaly request.
> >> >> You can set that how many request should be served with one worker,
> but
> >> >> you can't soft limit it's memory consumption.
> >> >> This is what the patch does:
> >> >> if you set the hard limit: (memory_limit) you can guarante that no
> >> >> process
> >> >> will use more memory, because if it tries, it will fail.
> >> >> and you can set soft limit, if that reached, the process will die and
> >> >> respawn after finishing the current request.
> >> >>
> >> >> Tyrael
> >> >
> >> > Btw: did you know about
> >> > http://php.net/manual/en/function.apache-child-terminate.php I just
> >> > noticed
> >> > a few days ago, obviously, you can't use with cgi/fastcgi/php-fpm but
> >> > for
> >> > apache, it does exactly what you need, except that you have to execute
> >> > from
> >> > userland.
> >>
> >> This function is interesting but it's called from php scripts. When
> >> you are a sysadmin who host hundreds of different customers, you can't
> >> garanty each customer will call this function each time he uses
> >> consomption scripts.
> >
> > Yeah, I know, and I think I did mention that, but this sounds like a good
> > feature in the language, but sadly it has too many limitation in it's
> > current form. (no windows support, only works with apache)
>
> I see how soft_limit could work (after processing a page, memory is
> checked and if it's more than the soft limit, the process is killed).
> But how can you make the hard_limit to work ? You'll have to setup
> memory check for each process by a master process

This is what the proposed php-fpm patch does, or am I missing something?

> , because the child
> won't be able to check it's memory realtime (or I missed something)
>
> ++ Jerome
>
If we talking about my proposal(to kill/set to kill the worker from inside
the request), then maybe you are right, I don't know much about the internal
memory management system, but you are saying, that there is no way to tell
the worker's memory consumption from inside the php userland?
there are functions like memory_get_usage(), memory_get_peak_usage(), and
there are ways in every OS to tell the ~ memory consumption of a given
process.
Am I missing something?

Tyrael

Reply via email to