
Soy bastante nuevo en la combinación de Apache y Django y, francamente, bastante ingenuo con respecto a cómo se manejan los subprocesos múltiples. Específicamente lo ejecuto en un servidor Windows, por lo que sé que MPM solo se basa en subprocesos.
Tengo una aplicación que sirve las páginas de un sitio web y otra aplicación que realiza un proceso en segundo plano intensivo de la CPU que ocurre de vez en cuando y demora hasta 30 segundos aproximadamente. Me preocupa tener problemas de rendimiento y tengo varias preguntas. Espero que ayuden a otros también...
- ¿Cómo distribuye Apache las solicitudes simultáneas entre subprocesos? ¿Y entre CPU? ¿Qué tipo de lógica impulsa esto? ¿Cada solicitud genera un hilo separado?
- ¿Puedo especificar manualmente que una determinada aplicación se ejecute en una CPU separada? Por ejemplo, si tengo una máquina con 4 CPU, ¿puedo configurar 1 CPU para solicitudes de sitios web y otras 3 para ejecutar el proceso en segundo plano bajo demanda?
- ¿Cómo leen/escriben varios subprocesos en la misma base de datos? No espero tener colisiones ya que la escritura se realizará por usuario, pero no sé cómo se maneja esto realmente.
- ¿Qué sucede si tengo más de una máquina de este tipo, por ejemplo ejecutando EC2 y tengo más de una instancia? ¿Cómo se distribuyen las solicitudes?
Gracias
Respuesta1
Para lectura general ver:
- http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading
- http://blog.dscpl.com.au/2009/03/python-interpreter-is-not-created-for.html
¿Cómo distribuye Apache las solicitudes simultáneas entre subprocesos?
Para una configuración multiproceso, existe un grupo de subprocesos creados previamente. Cuando llega una nueva solicitud, se pasa a uno de los subprocesos disponibles en el grupo para que la procese. Cuando termina, el hilo vuelve a la piscina.
¿Cómo distribuye Apache las solicitudes simultáneas entre CPU?
No es así, el sistema operativo determina dónde se ejecuta un subproceso en un momento específico. Apache no vincula los subprocesos a un procesador específico, por lo que la ejecución puede moverse.
¿Cada solicitud genera un hilo separado?
Para las solicitudes web manejadas por Apache, la respuesta es no.
¿Puedo especificar manualmente que una determinada aplicación se ejecute en una CPU separada?
Hay formas de configurar la afinidad del procesador para vincular procesos a procesadores, pero la forma de hacerlo depende del sistema. Hasta donde yo sé, Apache no proporciona ningún mecanismo de configuración para hacerlo por sí mismo.
¿Cómo leen/escriben varios subprocesos en la misma base de datos?
Con cuidado. Por lo general, el proceso del servidor de la base de datos se preocupa por todo eso, por lo que usted no tiene que preocuparse. Sin embargo, en un cliente, debe asegurarse de que cada subproceso esté usando su propia conexión de base de datos, creando una para cada solicitud, o si tiene un grupo de conexiones de base de datos y los subprocesos toman una conexión del grupo cuando es necesario y la devuelven cuando hecho.
Tenga en cuenta que esto supone una base de datos donde el acceso está mediado a través de un proceso de servidor. Si está utilizando una base de datos basada en un sistema de archivos, entonces la biblioteca cliente de la base de datos debe garantizar que el acceso multiproceso sea seguro.
¿Qué sucede si tengo más de una máquina de este tipo, por ejemplo ejecutando EC2 y tengo más de una instancia? ¿Cómo se distribuyen las solicitudes?
Necesitaría algún tipo de equilibrador de carga frontal para distribuir las solicitudes. Puede ser un equilibrador de carga adecuado, o puede utilizar una interfaz nginx como proxy.