Django mutli-threading no apache/mod_wsgi/windows

Django mutli-threading no apache/mod_wsgi/windows

Eu sou muito novo na combinação de apache e django e francamente bastante ingênuo em relação ao modo como o multi-threading é tratado. Especificamente, eu executo em um servidor Windows, então sei que o MPM é baseado apenas em thread.

Eu tenho um aplicativo que atende as páginas de um site e outro aplicativo que executa um processo em segundo plano com uso intensivo da CPU, que acontece de tempos em tempos e leva cerca de 30 segundos. Estou preocupado com a possibilidade de ter problemas de desempenho e ter várias perguntas. Espero que isso ajude outras pessoas também...

  1. Como o Apache distribui solicitações simultâneas entre threads? e entre CPUs? Que tipo de lógica impulsiona isso? Cada solicitação gera um thread separado?
  2. Posso especificar manualmente um determinado aplicativo para ser executado em uma CPU separada? Por exemplo, se eu tiver uma máquina com 4 CPUs, posso definir 1 CPU para solicitações de sites e outras 3 para executar o processo em segundo plano sob demanda?
  3. Como vários threads leem/gravam no mesmo banco de dados? Não espero haver colisões, pois a gravação será realizada por usuário, mas não sei como isso é realmente tratado.
  4. O que acontece se eu tiver mais de uma máquina desse tipo, por exemplo, rodando no EC2 e tendo mais de uma instância? Como as solicitações são distribuídas?

Obrigado

Responder1

Para leitura geral veja:

Como o Apache distribui solicitações simultâneas entre threads?

Para uma configuração multithread, existe um conjunto de threads pré-criados. Quando uma nova solicitação chega, ela é transferida para um dos threads disponíveis no pool para processamento. Quando terminar, o thread volta para o pool.

Como o Apache distribui solicitações simultâneas entre CPUs?

Isso não acontece, onde um thread é executado em qualquer momento específico é determinado pelo sistema operacional. Threads não estão vinculados a um processador específico pelo Apache, portanto a execução pode ser movimentada.

Cada solicitação gera um thread separado?

Para solicitações web tratadas pelo Apache a resposta é não.

Posso especificar manualmente um determinado aplicativo para ser executado em uma CPU separada?

Existem maneiras de definir a afinidade do processador para vincular processos a processadores, mas a maneira como você faz isso depende do sistema. O próprio Apache, até onde eu sei, não fornece nenhum mecanismo de configuração para fazer isso sozinho.

Como vários threads leem/gravam no mesmo banco de dados?

Com cuidado. Normalmente o processo do servidor de banco de dados se preocupa com tudo isso e então você não precisa se preocupar. Em um cliente, você precisa ter certeza de que cada thread está usando sua própria conexão de banco de dados, criando uma para cada solicitação, ou você tem um pool de conexões de banco de dados e threads que capturam uma conexão do pool quando necessário e a retornam quando feito.

Observe que isso pressupõe um banco de dados onde o acesso é mediado por um processo de servidor. Se você estiver usando um banco de dados baseado em sistema de arquivos, a biblioteca cliente do banco de dados deverá garantir que o acesso multithread seja seguro.

O que acontece se eu tiver mais de uma máquina desse tipo, por exemplo, rodando no EC2 e tendo mais de uma instância? Como as solicitações são distribuídas?

Você precisaria de algum tipo de balanceador de carga front-end para distribuir solicitações. Esse pode ser um balanceador de carga adequado ou você pode usar um front end nginx como proxy.

informação relacionada