mutli-threading do Django no apache / mod_wsgi / windows

1
Eu sou muito novo na combinação de apache e django e bastante ingênuo com relação a como o multi-threading é handeled. Especificamente eu corro em um servidor windows, então eu sei que o MPM é apenas baseado em threads.

Eu tenho um aplicativo que serve as páginas de um site, e outro aplicativo que executa um processo de fundo intensivo de CPU que acontece de tempos em tempos e leva cerca de 30 segundos ou mais. Estou preocupado que possa ter problemas de desempenho e ter várias dúvidas, espero que ajudem os outros também ...

  1. Como o apache distribui solicitações simultâneas entre encadeamentos? e entre CPUs? Que tipo de lógica impulsiona isso? Cada solicitação gera um segmento 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 website e 3 outras para executar o processo de segundo plano sob demanda?
  3. Como vários segmentos leram / gravam no mesmo banco de dados? Eu não espero ter colisões, pois a escrita será realizada por usuário, mas não sei como isso é realmente feito.
  4. O que acontece se eu tiver mais de uma dessas máquinas, por exemplo, executando no EC2 e tendo mais de uma instância? Como as solicitações são distribuídas?

Obrigado

    
por Ilan lewin 28.05.2013 / 07:39

1 resposta

3

Para leitura geral, consulte:

Como o apache distribui solicitações simultâneas entre os segmentos?

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 ser processada. Quando terminar, o segmento volta para o pool.

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

Não, onde um encadeamento é executado em qualquer momento específico é determinado pelo sistema operacional. Threads não estão ligados a um processador específico pelo Apache, então a execução pode se mover.

Cada solicitação gera um segmento separado?

Para solicitações da 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 não oferece, até onde eu sei, qualquer mecanismo de configuração para fazer isso sozinho.

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

Com cuidado. Normalmente, o processo do servidor de banco de dados preocupa-se com tudo isso e, portanto, você não precisa se preocupar. Em um cliente, você precisa ter certeza de que cada thread esteja usando sua própria conexão com o banco de dados, criando um para cada solicitação, ou se você tiver um pool de conexões de banco de dados e segmentos conecte-os ao pool quando necessário e os retorne quando feito.

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

O que acontece se eu tiver mais de uma dessas máquinas, por exemplo, executando 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. Isso pode ser um balanceador de carga adequado ou você pode usar um front end nginx como proxy.

    
por 28.05.2013 / 09:09