Как оптимизировать использование памяти php-процесса?

Я запускаю сайт wordpress и каждое использование PHP-процесса с размером памяти от 200 до 250 мс. С 16 ГБ оперативной памяти сервер может обрабатывать только около 70 процессов. Увеличивая виртуальную память до 16 ГБ, она может обрабатывать 140. После этого загрузка продолжает расти. Если за 10 минут установлено 200 подключений, загрузка сервера достигает 20 на четырехъядерном процессоре xhon 3Ghz!

Я попытался отключить все плагины, но это уменьшает использование памяти PHP для каждого процесса менее чем на 10%. suPHP говорит мне, какой пользователь использует столько памяти, но не какую часть кода WordPress.

Любое предложение о том, как уменьшить использование памяти? Или мой единственный вариант – до 32 ГБ оперативной памяти?

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10585 nobody 16 0 2266m 237m 199m S 21.3 1.5 1:09.17 /usr/bin/php 10597 nobody 16 0 2257m 255m 226m S 15.3 1.6 0:17.56 /usr/bin/php 

Самые большие выходы из pmap -d

 000000000e8b8000 27580 rw--- 000000000e8b8000 000:00000 [ anon ] 00002b3772850000 2097152 rw-s- 0000000000000000 000:00009 [ shmid=0x2d1b803a ] 00002b37f2a62000 55108 r---- 0000000000000000 0fd:00000 locale-archive mapped: 2320852K writeable/private: 30012K shared: 2097152K 

Выход ipcs

 ------ Semaphore Arrays -------- key semid owner perms nsems 0x000000a7 0 root 600 1 0x00000000 162529281 nobody 600 1 0x00000000 162562050 nobody 600 1 0x00000000 162594819 nobody 600 1 0x00000000 162627588 nobody 600 1 ------ Message Queues -------- key msqid owner perms used-bytes messages` 

Я подведу итог тому, что сделала Лиза, чтобы найти проблему:

  • Проверьте расположение памяти одного PHP-процесса с pmap -d <pid> . Результат показал, что в процессе используется огромное количество разделяемой памяти:
 00002b3772850000 2097152 rw-s- 0000000000000000 000:00009 [ shmid=0x2d1b803a ] 
  • Изучите области разделяемой памяти с помощью ipcs -m . Он показал, что существует много разделяемых областей памяти, созданных пользователем nobody (веб-сервером), вот лишь некоторые из них:
 0x00000000 117964807 nobody 600 2147483648 1 dest 0x00000000 117997576 nobody 600 2147483648 1 dest 0x00000000 118030345 nobody 600 2147483648 1 dest 0x00000000 118063114 nobody 600 2147483648 1 dest 
  • Отключите eAccelerator в php.ini и удалите созданные области разделяемой памяти:

для i в `ipcs -m | cut -d '' -f2 | grep '^ [0-9]' `; do ipcrm -m $ i; сделанный

Расмус Лердорф сделал конференцию о производительности PHP в Confoo в 2010 году, и он использовал блог WordPress в качестве примера, это должно дать вам отличные инструменты для ответа на ваш вопрос:

http://talks.php.net/show/confoo10/1

Подводить итоги:

  • Запустите phpinfo() и отключите расширения PHP, которые вы не используете. Они могут занять много памяти (воображение, завиток, …)
  • Сгенерируйте график, который вы используете, используя расширение inclued.so. Вы можете загружать бесполезные функции в настройку wordpress.
  • Запуск тестов с siege . Иногда крошечная оптимизация оказывает большое влияние на производительность, поэтому убедитесь, что у вас есть показатели, чтобы помочь вам принять ваши решения.
  • Используйте callgrind, чтобы показать, где вы теряете производительность. В одном из моих проектов я использовал md5() для хеширования своих SQL-запросов и их кеширования. md5() где используется 20% времени процессора.

Я бы определенно начал с отключения PHP-расширений, если это возможно.