Le 14 avril 2010 09:29, Jérôme Loyet <jer...@loyet.net> a écrit :
> 2010/4/6 滕路遥 <tly.phpf...@gmail.com>:
>> hi,
>>
>> We use PHP's Imagemagick extension to process images, and this would
>> consume a lot of memory under some circumstances.
>> However, the mainstream PHP's memory management is really weak, so a
>> huge amount of memory would be consumed under high server load. What's
>> worse, this even cause our server to crash frequently.
>>
>> So I suggest that if we could add a config option to PHP-FPM, so that
>> PHP-FPM could just kill a PHP process if it consumes too much memory
>> (say more than 256M).
>> This would prevent PHP from consuming a lot of memory which couldn't
>> be freed later.
>>
>> For example, assuming that this option is "exit_on_memory_exceeds",
>> and I set it to 256M. Also, I set PHP's "memory_limit" option to
>> 1024M.
>> I would expect PHP-FPM to kill the PHP process which consumes more
>> than 256M memory, even though PHP could use up to 1024M memory.
>> We have discussed this idea with the author of PHP-FPM,url is
>> http://groups.google.com/group/highload-php-en/browse_thread/thread/1882a3b2257dcc5c/ea73892cea011541?lnk=gst&q=gaochunhui#ea73892cea011541
>> , and now I have reach my goal by patching the source code of PHP-FPM. So
>> we can edit the php-fpm.conf and add one item such as "<value
>> name="term_on_memory_limit">3145728</value>" in the "global_options" section,
>> when PHP's memory beyond this limit,child process will exit.
>>
>> mypatch.diff 
>> http://docs.google.com/leaf?id=0B-ig5wUi7GTMZTUxYjg1ZTQtOGQ5Zi00N2Q1LTkxODYtYWQ4Y2FiMzhlOWM5&hl=en<%20http://docs.google.com/leaf?id=0B-ig5wUi7GTMZTUxYjg1ZTQtOGQ5Zi00N2Q1LTkxODYtYWQ4Y2FiMzhlOWM5&hl=en>
>>  This patch is for
>> http://svn.php.net/repository/php/php-src/branches/PHP_5_3_FPM version:
>> 294187.
>>
>
> thanks, I'll review the patch. But I don't have time right now. It's
> in my todo list.

The patch seems good (I didn't test it yet) but I'm curious about the
way you check the memory real size:

+                               if(zend_memory_usage(1 TSRMLS_CC) >
fpm_global_config.term_on_memory_limit){

I don't know much about the zend_memory_usage() function. But does it
return the real memory size of the process ?

ZEND_API size_t zend_memory_usage(int real_usage TSRMLS_DC)
{
  if (real_usage) {
    return AG(mm_heap)->real_size;
  } else {
    size_t usage = AG(mm_heap)->size;
#if ZEND_MM_CACHE
    usage -= AG(mm_heap)->cached;
#endif
    return usage;
  }
}

It seems it return the zend heap size. I don't know if it's the same
as the process heap size.

++ Jerome

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

Reply via email to