La respuesta de womble es asombrosa, aunque un poco difícil de entender y aplicar para los inexpertos. Me gustaría dar algunos números empíricos y una comparación de aplicaciones de "contenido simple" versus "comercio electrónico".
No hay mucho material para establecer diferentes casos de uso en relación con su configuración apropiada de mod_wsgi, así que espero que esté bien usar un poco de prosa aquí.
A) Sitios y micrositios de CMS
Ejecutamos varios sitios web de clientes, la mayoría de ellos principalmente sitios de contenido o micro sitios que alojan django CMS, algunos formularios personalizados y, a veces, Celery para tareas en segundo plano programadas. Estos sitios no tienen hambre de recursos, varios de ellos funcionan felizmente en paralelo en un solo Intel Xeon de 4 núcleos con 32 GB de RAM. Aquí está la configuración que utilizamos para cada uno de este tipo de sitios:
WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100
Estoy hablando de aproximadamente 40 sitios en un solo servidor, la mayoría de ellos con su sitio de ensayo funcionando en modo de espera. Con 2 procesos (que tienen 15 subprocesos cada uno, por defecto) los sitios están bien, aunque limitados en su capacidad de asignar recursos del servidor. Por qué esta configuración es suficiente puede justificarse con la naturaleza simple de la aplicación (CMS): nunca se espera que una solicitud tarde más de un par de milisegundos en completarse. Apache siempre se mantendrá relajado, y también lo será la carga de la CPU.
B) Sitios de comercio electrónico
Los sitios más complejos que realizamos se caracterizan por operaciones locales computacionalmente económicas pero dependencias externas (por ejemplo, servicios web que proporcionan datos de reserva) que son costosas en términos de tiempo de transacción. Las operaciones con solicitudes externas ocupan subprocesos durante mucho más tiempo, por lo que necesita más subprocesos para atender al mismo número de usuarios (en comparación con un sitio simple de CMS desde arriba). Peor aún, los subprocesos se bloquean ocasionalmente cuando un servicio externo no puede responder una solicitud de inmediato, a veces durante un par de segundos. Esto puede conducir al desagradable efecto secundario de que los subprocesos que colocan solicitudes en la misma cola de servicio se agoten, hasta que todos los subprocesos mod_wsgi disponibles se agoten y se bloqueen la espera.
Para esos escenarios, hemos tratado de usar 6
procesos sin ver mucha diferencia, y terminamos 12
viendo un impulso incomparable en el rendimiento y la estabilidad operativa:
WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100
El sitio maneja fácilmente algunas pruebas de carga simples con 150 y 250 usuarios paralelos, manteniéndose bien receptivo (mientras que con los 2
procesos el sitio es inutilizable para atender a 50 usuarios en paralelo). El 2 CPU 6 Core Intel Xeon con 32 GB de RAM funciona muy por debajo del 25% de uso de la CPU bajo esa carga, el uso de RAM casi se mantiene constante en menos del 25% también. Tenga en cuenta que aquí utilizamos una máquina dedicada solo para un solo sitio, por lo que no robaremos recursos que otros sitios puedan necesitar.
Conclusión
El uso de un mayor número de procesos es una compensación entre permitir que Apache haga uso de los recursos del sistema disponibles o no. Si desea mantener un sistema de servidor estable (¡no un sitio web!) En condiciones de "ataque", mantenga el número bajo. Si desea que Apache lo ayude a usar los recursos del sistema (CPU, RAM) cuando sea necesario, elija un número más alto. Qué tan alto puede llegar se calcula de manera similar a lo que se describe en la respuesta aceptada anteriormente, y en última instancia está limitado por la potencia de CPU y RAM disponibles.
(PD: mantengo la sección ConfigurationDirectives del wiki del proyecto modwsgi debajo de mi almohada para una lectura de fondo similar a Apache. También asegúrese de comprender y monitorear las conexiones abiertas de su servidor Apache ).