2012-07-11 12 views
6

Usando exactamente el mismo código, se necesitan aproximadamente 50ms de cada llamada a un método de registro (como logger.debug) en el servidor, mientras que en la máquina de desarrollo es menos de 1ms. Los registradores están generando archivos, con un poco de formateo.El registro de Python es extremadamente lento en el servidor Linux ... pero rápido en el desarrollo de Linux VM?

Aparte de las ralentizaciones con el registro, el servidor es el doble de rápido.

Estoy desarrollando en Ubuntu 11.04 (Gnome) ejecutándose dentro de VMWare en Windows 7. El servidor ejecuta Ubuntu Server 11.04 (sin GUI, consola pura). El módulo de registro es el módulo oficial de "registro" ("registro de importación ... registrador = registro.getLogger ('mylogger')").

¿Alguna idea de qué podría estar causando esto? ¡Es extremadamente frustrante!

¡Gracias por cualquier ayuda!

EDITAR: Ambas máquinas devuelven "Python 2.7.1+" para su versión. Ambas máquinas están ejecutando Ubuntu de 64 bits.

Configuración del disco duro El servidor es un software RAID-1, mientras que en el equipo dev solo hay un disco.

EDIT2: Aceptamos la respuesta de Fabian porque fue minuciosa, aunque no resolvió del todo el problema.

Solución: Escribir en la consola, punto, es extremadamente lento. Probé escribiendo X en un archivo y escribiendo X en la consola, y fue aproximadamente 100 veces más lento para la consola. No sé por qué sería eso, pero simplemente ejecuté lo que estaba ejecutando con ssh desde otra computadora y todo fue resuelto.

+0

Puede publicar las versiones de ambos python's –

+0

También puede verificar que se estén utilizando exactamente los mismos registradores en ambas máquinas. El paquete ['logging_tree'] (http://pypi.python.org/pypi/logging_tree/1.1) sería útil allí. –

+1

puede intentar iniciar sesión en stdout y no en archivo y verificar si cambia la velocidad. Podría ser un problema con el disco duro. –

Respuesta

6

Como se señala en los comentarios, una posible razón es la diferencia de velocidad de disco entre la VM de desarrollo y la máquina de producción. ¿Tiene el mismo tipo de unidades en ambos sistemas, por ejemplo. SSD, SATA vs. SCSI, velocidad del cabezal y caché, etc. Sus entornos son bastante diferentes en términos de IO. Desktop Windows y VMWare utilizarán cachés de disco agresivos, mientras que su máquina Linux de producción probablemente se equivocará y esperará a que los datos se envíen al disco con más frecuencia. Tal vez la máquina de Windows tiene controladores que son más adecuados para el tipo de disco que tiene, mientras que el servidor se ejecuta sin optimizaciones? Las diferencias del sistema de archivos también son importantes, y el hardware probablemente sea lo suficientemente diferente como para causar diferencias significativas en la velocidad de IO. También podría tener grandes diferencias en la velocidad de la CPU y la RAM. Las máquinas de escritorio en la actualidad a menudo se centran más en la velocidad bruta, mientras que el hardware del servidor se centrará más en la fiabilidad. Usted conoce mejor su configuración, por lo que probablemente pueda comparar los dos sistemas en términos de rendimiento del hardware.

Más allá de eso, aquí es cómo se puede averiguar lo que realmente está pasando:

En primer lugar, escribir EPM para probar la tala. Debe basar en su código real, y utilizar el registro de una manera similar, pero aquí hay un pequeño ejemplo:

import logging 

logging.basicConfig(filename="test.log", level=logging.DEBUG) 
logger = logging.getLogger("testlogger") 

for i in range(0, 1000000): 
    logger.info("iteration: %d", i) 

y ejecute el guión bajo cprofile tanto en su desarrollo y la máquina de producción. Asegúrese de iniciar sesión en el mismo sistema de archivos que en su caso problema, de lo contrario los resultados no serán aplicables.

python -m cProfile testlogging.py 

Va a obtener una salida que tiene este aspecto:

57000501 function calls in 137.072 seconds 

Ordered by: standard name 

ncalls tottime percall cumtime percall filename:lineno(function) 
    1 0.000 0.000 0.000 0.000 UserDict.py:4(__init__) 
    1 0.000 0.000 0.000 0.000 __init__.py:1044(_fixupParents) 
    1 0.000 0.000 0.000 0.000 __init__.py:1085(Logger) 
    2 0.000 0.000 0.000 0.000 __init__.py:1100(__init__) 
    1 0.000 0.000 0.000 0.000 __init__.py:1112(setLevel) 
..... ..... ..... ..... ..... ............................... 

Esto debe darle una idea de lo que está causando la lentitud en la máquina de producción.Las cosas a buscar en particular:

  • busque líneas {method 'write' of 'file' objects} y {method 'flush' of 'file' objects}. Esto le indicará cuánto tiempo ha pasado Python escribiendo en archivos y vaciando los datos al disco, en este caso, el archivo de registro. ¿Hay diferencias significativas entre las dos máquinas? Si es así, definitivamente es una diferencia en la velocidad de IO (disco). Debería echar un vistazo a la configuración del disco del servidor y ver si hay algo que pueda hacer para obtener un mejor rendimiento del disco.
  • Busque las líneas donde la primera columna percall es particularmente grande. Esta columna es el tiempo total dedicado a la función dividido por el número de llamadas a esa función. Compare las dos máquinas, y puede encontrar lo que está causando la diferencia.
  • Busque las líneas donde la columna tottime es particularmente grande. Esta columna es el tiempo total dedicado a la función. Nuevamente, compare las dos máquinas, y puede encontrar algunas razones para la diferencia de velocidad.

Si ve que el disco IO parece ser el problema, puede hacer una prueba adicional simplemente escribiendo sin formato en los archivos. Probablemente pueda encontrar un programa de evaluación comparativa que le permita probar el rendimiento del disco, pero también podría simplemente escribir un programa simple C (o Python) que escriba datos sin formato en un archivo para asegurarse de que realmente sea el rendimiento puro del disco la diferencia.

Una última observación: las pruebas de rendimiento son, como la programación, una mezcla de arte, ciencia e ingeniería, y si bien hay patrones y consejos que puede seguir, cada caso necesita un poco de inventiva para descifrar. ¡Entonces prueba cosas, asegúrate de no engañarte y diviértete! ¡Buena suerte!

Cuestiones relacionadas