2012-04-27 28 views
8

Estoy ejecutando un sitio de wordpress y cada uso de proceso de PHP tiene una memoria de tamaño residente de 200 MB a 250 MB. Con 16 GB de memoria RAM, el servidor solo puede manejar unos 70 procesos. Al aumentar la memoria virtual a 16 GB, puede manejar 140. Después de eso, la carga sigue aumentando. Si hay 200 conexiones en 10 minutos, la carga del servidor llega a 20 en un procesador xeon quad-core 3Ghz.¿Cómo optimizar el uso de la memoria del proceso php?

He intentado desactivar todos los complementos, pero esto solo reduce el uso de la memoria PHP de cada proceso en menos del 10%. suPHP me dice qué usuario está usando tanta memoria, pero no qué parte del código de wordpress.

¿Alguna sugerencia sobre cómo reducir el uso de memoria? ¿O es mi única opción actualizar a 32 GB de RAM?

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 

más grandes salidas de 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 salida

------ 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` 
+0

¿Ya había intentado instalar APC u otra solución similar de caché de código de operación? – raina77ow

+0

Sí. Estoy usando eAccelerator y Zend Optimizer. APC actualmente no está incluido en cPanel. Los otros dos se pueden compilar con easyapache. – Lisa

+0

Eso es extraño, estoy ejecutando algunos servidores de alojamiento y la mayoría de las instancias de PHP consumen entre 7 y 50 MB de memoria RSS. Mis sugerencias son: 1. actualizar a php 5.4 (debido a la huella de memoria reducida). 2. Instale algún proxy inverso (como barniz) delante de wordpress. – strkol

Respuesta

5

voy a resumir lo que Lisa hizo para encontrar el problema:

  • Comprobar el diseño de memoria de un solo proceso PHP con pmap -d <pid>. La salida mostró que hay una enorme cantidad de memoria compartida utilizada por el proceso:
00002b3772850000 2097152 rw-s- 0000000000000000 000:00009 [ shmid=0x2d1b803a ] 
  • Examine las regiones de memoria compartida con ipcs -m.Se demostró que hay una gran cantidad de regiones de memoria compartida por nadie usuario (servidor web), que aquí son sólo algunos de ellos:
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 
  • Desactivar eAccelerator en php.ini y retirar las regiones de memoria compartida:

for i in `ipcs -m | cut -d '' -f2 | grep '^ [0-9]' '; hacer ipcrm -m $ i; hecho

2

Rasmus Lerdorf hizo una conferencia sobre el rendimiento de PHP en Confoo en 2010 y que utiliza un blog de Wordpress como un ejemplo , esto debería proporcionarle excelentes herramientas para responder a su pregunta:

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

Para resumir:

  • ejecutar un phpinfo() y desactivar extensiones PHP que no utilice. Pueden tomar mucha memoria (imagick, curl, ...)
  • Genere un gráfico de sus inclusiones usando la extensión inclued.so. Puede cargar funciones inútiles en su configuración de wordpress.
  • Ejecutar puntos de referencia con siege. A veces, las pequeñas optimizaciones tienen un gran impacto en el rendimiento, así que asegúrese de tener métricas para ayudarlo a tomar sus decisiones.
  • Use callgrind para mostrar dónde está perdiendo rendimiento. En uno de mis proyectos estaba usando md5() para analizar mis consultas SQL y almacenarlas en caché. Las llamadas md5() utilizan el 20% del tiempo de CPU.

Definitivamente comenzaré deshabilitando las extensiones de PHP si es posible.

+1

Gracias. Strkol descubrió que eaccelerator es el problema. Cuando está deshabilitado, PHP solo usa RES de 60m a 80m por proceso. – Lisa

+0

@Lisa No hay problema. Mira las herramientas sugeridas por Rasmus Lerdorf si tienes la oportunidad. ¡Fue una gran charla! – Tchoupi

+0

La pregunta es acerca de la memoria y no de la optimización de velocidad. –

Cuestiones relacionadas