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

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

Я попытался деактивировать все плагины, но это уменьшило использование памяти 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`

person Lisa    schedule 27.04.2012    source источник
comment
Вы уже пробовали установить APC или подобное решение для кэширования опкодов?   -  person raina77ow    schedule 27.04.2012
comment
да. Я использую eAccelerator и Zend Optimizer. APC в настоящее время не включен в cPanel. Два других можно скомпилировать с помощью easyapache.   -  person Lisa    schedule 27.04.2012
comment
Это странно, я использую несколько хостинговых серверов, и большинство экземпляров PHP потребляют от 7 до 50 МБ RSS-памяти. Мои предложения: 1. Обновитесь до php 5.4 (из-за уменьшения объема памяти). 2. Установите какой-нибудь обратный прокси (например, Varnish) перед WordPress.   -  person strkol    schedule 27.04.2012
comment
@strkol cpanel еще не предоставляет 5.4. Обратный прокси, такой как лак, снижает нагрузку и заставляет сервер обрабатывать больше трафика. Но я не помогу найти причину проблемы. Что-то заставляет PHP потреблять от 200 до 250 МБ RSS-памяти, я просто не знаю, как это найти. Спасибо за совет.   -  person Lisa    schedule 27.04.2012
comment
@ Лиза, не могли бы вы вставить вывод pmap -d ‹pid-of-php›?   -  person strkol    schedule 27.04.2012
comment
Список огромный. Все находится между 4 и 2048 байтами. Но я добавил к этому вопросу еще несколько важных моментов. Синхронизация здесь выглядела бы странно.   -  person Lisa    schedule 27.04.2012
comment
позвольте нам продолжить обсуждение в чате   -  person Lisa    schedule 27.04.2012


Ответы (2)


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

  • Проверьте структуру памяти отдельного процесса PHP с помощью pmap -d <pid>. Результат показал, что процессом используется огромное количество разделяемой памяти:
00002b3772850000 2097152 rw-s- 0000000000000000 000:00009   [ shmid=0x2d1b803a ]
  • Изучите области общей памяти с помощью ipcs -m. Он показал, что существует множество областей разделяемой памяти, созданных пользователем none (веб-сервером), вот лишь некоторые из них:
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 | вырезать -d '' -f2 | grep '^ [0-9]' `; сделать ipcrm -m $ i; сделано

person strkol    schedule 27.04.2012

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

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

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

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

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

person Tchoupi    schedule 27.04.2012
comment
Спасибо. Strkol обнаружил, что проблема в ускорителе. Когда отключено, PHP использует только 60-80 мегабайт RES на процесс. - person Lisa; 28.04.2012
comment
@ Лиза Нет проблем. Ознакомьтесь с инструментами, предложенными Расмусом Лердорфом, если у вас есть возможность. Это был потрясающий разговор! - person Tchoupi; 28.04.2012
comment
Вопрос в памяти, а не в оптимизации скорости. - person Vladas Diržys; 02.09.2014