12 votos

Ubuntu recolección de cron job para PHP tarda 25 minutos en ejecutarse, ¿por qué?

Ubuntu tiene un cron job que busca y elimina los viejos PHP:

# Look for and purge old sessions every 30 minutes
09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] \
   && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 \
   -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir \
   fuser -s {} 2> /dev/null \; -delete

Mi problema es que este proceso es tomar un tiempo muy largo a correr, con un montón de e / s de disco. Aquí está mi uso de la CPU gráfico:

CPU usage graph

La limpieza se ejecuta es representado por el color verde azulado de picos. En el comienzo del período, PHP trabajos de limpieza se llevaron a cabo en el valor predeterminado 09 y 39 minutos de veces. A las 15:00 me quita el 39 minutos de tiempo de cron, por lo que un trabajo de limpieza dos veces el tamaño de la mitad de la frecuencia (se puede ver los picos de conseguir el doble de ancho y la mitad frecuente).

Aquí están las gráficas correspondientes para IO tiempo:

IO time

Y de las operaciones de disco:

Disk operations

En la cima, donde había alrededor de 14.000 sesiones activas, la limpieza puede ser visto a ejecutar para un total de 25 minutos, al parecer, el uso de 100% de un núcleo de la CPU y lo que parece ser el 100% de la e / s de disco para todo el período. ¿Por qué es tan intensivo en recursos? Un ls de la sesión de directorio /var/lib/php5 tarda apenas una fracción de segundo. Entonces, ¿por qué se tarda 25 minutos para recortar las sesiones antiguas? Hay algo que yo pueda hacer para acelerar este proceso?

El sistema de ficheros para este dispositivo es actualmente el sistema de archivos ext4, que se ejecuta en Ubuntu precise 12.04 de 64 bits.

EDIT: tengo la sospecha de que la carga es debido a la inusual proceso de "fusor" (ya que espero una simple rm a ser una maldita vista más rápido que el rendimiento de la estoy viendo). Voy a eliminar el uso de fusor y ver qué pasa.

9voto

Michael Hampton Puntos 88271

Felicitaciones por tener un popular sitio web y la gestión para que siga funcionando en una máquina virtual durante todo este tiempo.

Si realmente estás tirando en dos millones de páginas vistas por día, entonces usted va a la pila de un MONTÓN de sesiones de PHP en el sistema de ficheros, y va a tomar un largo tiempo para eliminar no importa si usted usa fuser o rm o una aspiradora.

En este punto, me gustaría recomendar que busque en formas alternativas para almacenar sus sesiones:

  • Una opción es almacenar las sesiones en memcached. Esta es la velocidad del rayo, pero si el servidor se bloquea o se reinicia, todas las sesiones están perdidos y todo el mundo está conectado.
  • También puede almacenar las sesiones en una base de datos. Esto sería un poco más lento que el de memcached, pero sería la base de datos persistentes, y usted puede limpiar los viejos sesiones con una simple consulta SQL. Para implementar esto, sin embargo, usted tiene que escribir una sesión personalizada de controlador.

8voto

Peter Stone Puntos 1962

La eliminación de fuser debe ayudar. Este trabajo se ejecuta un fuser comando (comprobar si un archivo está abierto) para cada período de sesiones del archivo encontrado, que puede tardar varios minutos en un sistema ocupado con oro de 14 sesiones. Esta fue una de fallos de Debian (Ubuntu está basado en Debian).

En lugar de memcached también puede intentar usar tmpfs (un sistema de ficheros en la memoria) para archivos de sesión. Como memcached esto invalidaría sesiones en el reinicio (esto puede ser solucionado mediante la creación de copias de seguridad de este directorio en algún lugar en la secuencia de comandos de apagado y la restauración en la secuencia de comandos de inicio), pero será mucho más fácil a la instalación. Pero no va a ayudar con fuser problema.

7voto

Ed Ball Puntos 1341

Con que tipo de tráfico que no se debe poner a las sesiones de la dis. Usted debe estar usando algo como memcache. Todo lo que tienes que hacer es configurar php y no habrá ningún cambio de código necesario. Véase, por ejemplo,

http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/

La razón por la que está tomando tanto tiempo es debido a la gigantesca cantidad de archivos que tiene que ordenar a través de ver cuáles pueden ser eliminados. Memcache puede auto vencen estas dada su duración de la sesión se establece en el código.

4voto

thenickdude Puntos 213

Así, el Memcached y sesión de base de datos de almacenamiento de las opciones sugeridas por los usuarios aquí son dos buenas opciones para aumentar el rendimiento, cada uno con sus propias ventajas y desventajas.

Pero por las pruebas de rendimiento, me encontré con que el enorme coste de cumplimiento de esta sesión de mantenimiento es casi en su totalidad hacia abajo a la llamada a la fuser en el cron job. He aquí los gráficos de rendimiento después de revertir a la Natty / Onírico cron job que utiliza rm en lugar de fuser a recortar las sesiones antiguas, el cambio ocurre a las 2:30.

CPU usage

Elapsed IO time

Disk operations

Se puede ver que el periódico el rendimiento de la degradación causada por el Ubuntu PHP sesión de limpieza es casi totalmente eliminado. Los picos que se muestra en las Operaciones de Disco gráfico son ahora mucho más pequeño en magnitud, y tan flaco como este gráfico, posiblemente, puede medir, mostrando una pequeña interrupción en donde anteriormente el rendimiento del servidor se degrada significativamente durante 25 minutos. Extra el uso de la CPU es eliminar completamente, esto es ahora un IO-bound de trabajo.

(una relación de IO que se ejecuta el trabajo a las 05:00 y la CPU ejecuta el trabajo a las 7:40 que causan sus propias púas en estos gráficos)

La versión modificada de la tarea en el cron estoy ejecutando ahora es:

09 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && \
   [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 \
   -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 \
   | xargs -n 200 -r -0 rm

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: