2010-03-16 18 views
9

Estoy trabajando en una aplicación web PHP que permite a los usuarios conectarse entre sí, reservar eventos y enviar mensajes entre ellos. Solo hay unos 100 usuarios.¿Cómo puedo saber si mi aplicación PHP usa demasiada memoria?

Configuré la aplicación en un VPS con Ubuntu 9.10, apache2, mysql 5 y php 5. Tenía 360 Mb de RAM, pero actualicé a 720 MB.

Últimamente, mi aplicación web ha experimentado interrupciones debido al uso excesivo de memoria. Por lo que puedo decir en los registros de errores, parece que el servidor mata automáticamente los procesos de Apache que consumen demasiada memoria. Como resultado, actualicé la memoria de 360 ​​MB a 720 MB como una medida provisional.

Entonces mi pregunta es, ¿cómo puedo resolver estos problemas de interrupción? ¿Cómo sé si la necesidad de más memoria de mi sitio web se debe a un código pobre o si es parte del crecimiento natural del sitio web? ¿Cuál es la forma más eficiente de determinar qué scripts PHP consumen la mayor cantidad de memoria?

+1

es suficiente con 720 MB de memoria? deberías considerar obtener más RAM no estás usando un software que fue hace 10 años. – ghostdog74

+0

¿Cuánta memoria debería tener al menos? – John

+2

@ ghostdog74: Está usando un VPS, que es un servidor virtual donde normalmente paga mensualmente los recursos de disco y memoria. – spoulson

Respuesta

4

No hay una respuesta simple a esto, aunque sospecho que puede haber un problema en su código.

¿Cuál es la configuración memory_limit en su archivo php.ini? Por lo general, recomiendo al menos 4Mb, y por lo general, 16. ¿Cuántos hits simultáneos están presentando? ¿El sitio está reportando mucho sobre las estadísticas? ¿O la representación de imágenes a través de PHP? ¿Usas file_get_contents() en cualquier lugar?

Realmente necesita configurar algunos registros personalizados para generar informes para cada URL, el tamaño del archivo de registro en la salida. p.ej. usted podría auto-Prefijo:

<?php 
register_shutdown_function('log_mem'); 

function log_mem() 
{ 
    fputs(STDERR, '[' . date('c') . '] ' . memory_get_usage() . ' ' 
    . $_SERVER["REQUEST_URI"] . "\n"); 
} 

(Nota - sin etiqueta de cierre) Esto escribirá la memoria utilizada por cada página PHP para el error_log para que pueda aislar el problema con mayor facilidad.

HTH

C.

+0

Obteniendo esto: "Advertencia: fputs() espera que el parámetro 1 sea recurso, cadena dada ..." – Stefan

0

Dependiendo de la versión del httpd & php, httpd podría aferrando a segmentos de memoria que no necesita, y hacer crecer el tamaño de proceso en ejecución innecesariamente . Tengo una caja que hace esto, y he resuelto el problema haciendo una httpd restart en las noches de este modo:

30 00 * * *  /httpd/sbin/apachectl restart 
31 00 * * *  /httpd/sbin/apachectl start 
35 00 * * *  /httpd/sbin/apachectl start 
40 00 * * *  /httpd/sbin/apachectl start 

Como se puede ver, sigo mi reinicio con 3 aperturas de fuga, tal en caso de que apache no vuelva a la vida después del reinicio. 3 es probablemente excesivo, pero por otro lado, no duele nada, ¿por qué no?

+0

No sabe por qué esto se está downvoted, muchas personas han reportado fugas de memoria cuando se utiliza una pila de lámpara: http://www.google.com/search?q=httpd+php+memory+leak&ie=utf- 8 & oe = utf-8 & aq = t & rls = org.mozilla: en-US: official & client = firefox-a No significa que sea una memoria con fuga de httpd, sino que puede ser fácilmente una biblioteca a la que se llama dentro de php. Esto no niega el hecho de que es el proceso httpd la memoria se atribuye a ... – Zak

+0

También, * * es posible que llegue un proceso que no muere durante el período de tiempo que el reinicio intentos de llevar Apache copia de seguridad. Más específicamente, he tenido apache morir durante una medianoche elegante, debido a un proceso que toma una cantidad exorbitante de tiempo para morir. De nuevo, si usted va a downvote, apreciaría una razón por qué, o por lo menos una mejor manera de hacer las cosas ... – Zak

+0

Es cada vez downvoted porque no es una solución, es una solución. Hay muchos lugares para buscar para identificar tales fugas, que es muy poco probable que tengan algo que ver con el problema informado donde se completa el montón de zvar. – symcbean

3

Otra cosa que puede hacer si el tamaño de su proceso es pequeño es rechazar la configuración de httpd para tener servidores de repuesto mínimos de 1 y servidores de repuesto máximos de 3. Si solo tiene 100 usuarios, esto debería estar bien, ya que no le importará la sobrecarga de los procesos iniciales para solo unos pocos usuarios.

Cuestiones relacionadas