PHP 5.5, при каких обстоятельствах PHP вызывает очень высокую память

Я пытаюсь понять ситуацию, когда PHP не потребляет много памяти, но вместо этого вызывает очень высокий результат Committed_AS.

Возьмите этот отчет памяти мюнина, например:

munin memory

Как только я запускаю нашу очередь Laravel (10 ~ 30 рабочих), преданная память проходит через крышу. У нас есть 2G mem + 2G swap на этом экземпляре vps, и до сих пор существует около 600M неиспользуемой памяти (это около 30% бесплатно).

Если я понял Committed_AS правильно, это означало гарантию 99.9% out of memory, учитывая текущую рабочую нагрузку, и кажется чтобы предложить нам утроить нашу память VPS, чтобы быть в безопасности.

Я попытался уменьшить количество очередей от 30 до 10, но, как вы видите, зеленая линия довольно высока.

Что касается настройки: Laravel 4.1 с включенным opcache PHP 5.5. Выскочка script используется экземпляр spawn, например:

instance $N

exec start-stop-daemon --start --make-pidfile --pidfile /var/run/laravel_queue.$N.pid --chuid $USER --chdir $HOME --exec /usr/bin/php artisan queue:listen -- --queue=$N --timeout=60 --delay=120 --sleep=30 --memory=32 --tries=3 >> /var/log/laravel_queue.$N.log 2>&1

Я видел много случаев, когда использование с высоким подкачкой подразумевает недостаточную память, но наше использование подкачки низкое, поэтому я не уверен, какой способ устранения неполадок здесь подходит.

PS: у нас нет этой проблемы до Laravel 4.1 и нашего обновления vps, вот изображение, чтобы доказать это.

old munin memory

Возможно, мне следует перефразировать мой вопрос следующим образом: как точно вычисляются Committed_AS и как PHP влияет на него?


Обновлено 2014.1.29:

У меня была теория по этой проблеме: поскольку работник очереди laravel фактически использует PHP sleep(), ожидая нового задания из очереди (в моем случае beanstalkd), это предполагает, что высокая оценка Committed_AS обусловлена относительно низкая рабочая нагрузка и относительно высокое потребление памяти.

Это имеет смысл, поскольку я вижу Committed_AS ~ = avg. memory usage / avg. workload. Поскольку PHP sleep() корректно, мало используется процессор; но все же память, которую он потребляет, по-прежнему сохраняется. Какой результат в мышлении сервера: эй, вы используете так много памяти (в среднем), даже когда загрузка минимальна (в среднем), вы должны быть лучше подготовлены к более высокой нагрузке (но в этом случае более высокая загрузка не приводит к увеличению объема памяти след)

Если кто-то хочет проверить эту теорию, я буду рад наградить их наградой.

Ответы

Ответ 1

Недавно я нашел основную причину этой проблемы с высокой памятью: Настройки PHP 5.5 OPcache.

Похоже, что put opcache.memory_consumption = 256 заставляет каждый процесс PHP резервировать гораздо больше виртуальной памяти (можно увидеть в столбце VIRT в вашей команде top), в результате чего Munin оценивает потенциальную память, которая будет намного выше.

Количество очередей laravel, которые мы выполняем в фоновом режиме, только преувеличивает проблему.

Поместив opcache.memory_consumption в рекомендуется 128 MB (мы действительно не использовали все эти 256 МБ эффективно), мы вырезали оценку значение в два раза, в сочетании с недавним обновлением ОЗУ на нашем сервере, оценка составляет около 3 ГБ, гораздо более разумная и в пределах нашего общего предела RAM

Ответ 2

Две вещи, которые вам нужно понять о Committed_AS,

  • Это оценка
  • В нем указано, сколько памяти вам потребуется в худшем случае (плюс своп). Это зависит от рабочей нагрузки вашего сервера в то время. Если у вас более низкая рабочая нагрузка, Committed_AS будет ниже и наоборот.

Если это не проблема с предыдущей итерацией очереди фреймов и при условии, что вы не ввели какие-либо новые изменения кода в производственную среду, вам нужно сравнить две итерации. Возможно, разверните еще одну коробку и выполните несколько тестов. Вы также можете профилировать приложение с помощью xdebug или zend_debugger, чтобы обнаружить возможные причинные факторы с помощью самого кода. Другим полезным инструментом является strace.

Все самое лучшее, вам это понадобится!

Ответ 3

Committed_AS - фактический размер, который ядро ​​фактически обещало процессам. И queues работает независимо и не имеет ничего общего с PHP или Laravel. В дополнение к тому, что сказал Rijndael, я рекомендую установить New Relic которые могут быть использованы для выяснения проблемы.

Совет. Я заметил огромное снижение нагрузки на сервер с помощью комбинации NginX-HHVM. Попробуйте.