2012-04-03 19 views
6

Hice una aplicación cliente que usa HTTP para comunicarse con un servidor Python 2 usando una API simple. El servidor usa el ORM de SQLAlchemy bastante extensamente para servir los datos para esas solicitudes HTTP. El problema es que el uso de mi CPU es bastante alto incluso con pocos clientes activos. Este servidor debería poder atender a unos pocos cientos de clientes al mismo tiempo, alrededor de 1 solicitud de un segundo por cliente, por lo que debería ser manejable (o eso espero).¿Cómo mejorar el rendimiento de SQLAlchemy?

¿Cómo puedo mejorar el rendimiento? Sé que el problema es el ORM, ya que cProfile muestra esto con bastante claridad. Una sola consulta aparentemente ejecuta alrededor de 10000 instrucciones de Python, lo que parece bastante extraño. Intenté conectar diferentes motores de base de datos/backends y cambié el intérprete a Pypy solo por diversión, pero obviamente no ayudó al problema original y tampoco mejoró el rendimiento.

¿Qué estoy haciendo mal aquí? Realmente espero que este sea un "¡bien, duh!" problema.

¿Deberían mis relaciones ser de un tipo diferente? ansioso, perezoso, dinámico, etc. En este momento, no especifico nada en particular.

Ayuda muy apreciada.

+5

eche un vistazo a mi respuesta http://stackoverflow.com/questions/1171166/how-can-i-profile-a-sqlalchemy-powered-application/1175677#1175677 para algunos lugares donde comenzar – zzzeek

Respuesta

0

¿Cuán dinámicas son las consultas, es solo un tipo de objeto que siempre se devuelve o se trata de muchos modelos diferentes. ¿Cuántas filas estás devolviendo? ¿Puedes limitar el número de columnas o el número de filas? A grandes volúmenes de datos, suponiendo que tiene todo lo fácil ya arreglado, incluso python convirtiendo las columnas a los tipos de datos correctos puede causar una cantidad decente de sobrecarga.

También tengo SQLAlchemy solo para proyectos rápidos, pero ¿es posible que el uso de la CPU aumente mientras espera los resultados? Si ese es su problema, puede sumergirse en la creación de perfiles de las consultas reales que se están ejecutando y asegurarse de que estén indexadas correctamente y de que el orm las esté generando de manera óptima.

+0

Las consultas SQL son bastante pocos y devuelven bolsillos muy pequeños de artículos. La mayor parte del tiempo se gasta en el ORM mismo. – Svenstaro

Cuestiones relacionadas