2010-02-10 11 views
6

Al desarrollar una aplicación Django implementada en Apache mod_wsgi encontré que en caso de subprocesamiento múltiple (procesos Python, procesos mod_wsgi = 1 hilos = 8) Python no usará todos los procesadores disponibles. Con el enfoque de multiprocesamiento (mod_wsgi processes = 8 threads = 1) todo está bien y puedo cargar mi máquina al máximo.¿Python usará todos los procesadores en el modo de subprocesos?

Entonces la pregunta: ¿este comportamiento de Python es normal? Lo dudo porque usar 1 proceso con pocos hilos es el enfoque predeterminado de mod_wsgi.

El sistema es:

serie 2xIntel Xeon 5XXX (8 núcleos (16 con hyperthreading)) en FreeBSD 7.2 AMD64 y Python 2.6.4


Gracias a todos por respuestas. Todos encontramos que este comportamiento es normal debido a GIL. Aquí hay una buena explicación: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/ o stackoverflow GIL discussion: .

+1

¿por qué esta pregunta tiene tres votos favorables? una simple búsqueda en Google hubiera sido suficiente. – aaronasterling

+0

@aaronasterling: Nos gusta hacer de stackoverflow una gran base de datos de conocimiento con preguntas simples y respuestas simples. Asegúrese de que esta información esté disponible si su STFG – HardQuestions

Respuesta

10

Will Python usará todos los procesadores en el modo de subprocesos? No.

Python no usará todos los procesadores disponibles; es este comportamiento de Python normal? Sí, es normal debido a GIL.

Para una discusión, vea http://mail.python.org/pipermail/python-3000/2007-May/007414.html.

Puede encontrar que tener un par (o 4) de subprocesos por núcleo/proceso aún puede mejorar el rendimiento si hay algún bloqueo, por ejemplo, esperar una respuesta de la base de datos haría que ese proceso bloqueara otras conexiones.

+0

la última sugerencia que hizo no puede mejorar el rendimiento sobre un enfoque de bloqueo único sin bloqueo – nosklo

1

No sé si todavía es el caso, pero hay un bloqueo global en el intérprete de Python, que impide el uso de todos los recursos del procesador de un solo intérprete, incluso cuando se usa multi-threading. IIRC, el bloqueo global tiene que ver con E/S.

Parece que está viendo el resultado de este bloqueo, por lo que, personalmente, utilizaría varios procesos con un solo hilo.

4
  1. ¿Pitón usará todos los procesadores en el modo de subproceso? No.

  2. ¿Esto es normal? Sí, esto es normal. Python no hace ningún esfuerzo por localizar todos sus núcleos.

  3. "1 proceso con pocos hilos es el enfoque predeterminado de mod_wsgi". Pero eso no es óptimo o incluso deseable. Eso es solo un defecto. No leas nada.

Si desea utilizar todos los recursos de su computadora, haga que el SO lo maneje. Usa procesos

La distinción entre procesamiento múltiple y multi-threading es difícil de medir en su mayor parte. El uso de procesos o hilos apenas importa. Por lo general, es más sencillo usar procesos, ya que hay soporte de sistema operativo trivial para esto.

línea de base

Use procesos múltiples, que permite que el sistema operativo (y Apache) para hacer el mayor uso posible del sistema.

Los subprocesos comparten un conjunto limitado de recursos de E/S para el proceso del que forman parte, y el servicio de la página web está vinculado a E/S. Los procesos tienen recursos de E/S independientes y maximizarán más fácilmente su procesador.

+0

vea también: http://docs.python.org/library/multiprocessing.html – exhuma

1

Sí. Python no es realmente multihilo. En cambio, hay un bloqueo global y cada subproceso ejecuta algunas operaciones sucesivamente. Esto hace que sea mucho más simple escribir aplicaciones MT en Python ya que no puede haber ningún problema con caches obsoletas, etc.

Entonces, un proceso Python solo puede ocupar una sola CPU. Para utilizar completamente un sistema multi-core, debe ejecutar varios procesos de Python.

3

Todavía hay esperanza. El GIL es solo un artefacto de implementación de la implementación de C Python que descarga desde python.org. Jython e IronPython son otras dos implementaciones de Python, y no tienen GIL, por lo que puede tener mejores resultados de subprocesamiento con uno de ellos.

+1

Cierto, pero el OP no puede usar Jython o IronPython con mod_wsgi. –

Cuestiones relacionadas