Como configurar os “trabalhadores” do Apache para máxima simultaneidade

3

Esperando que esta seja uma boa pergunta e possa ser útil para qualquer pessoa em situação semelhante. Recentemente, substituí um administrador Linux muito antigo da minha empresa e, pela primeira vez, tive que configurar um novo servidor para servir nosso conteúdo aos nossos clientes. Meu antecessor deixou documentação limitada sobre este assunto, já que outras coisas eram de maior prioridade no momento de sua partida. Referi-me extensivamente a que documentação eu tinha, além de configurações de servidores anteriores e muita leitura online para configurar tudo.

A "pilha" de um servidor que estou construindo é a seguinte: CentOS 7, Apache 2.4.6, MariaDB 5.X, Tomcat 7 servindo JSP / Servlets. Instalações anteriores para produção usaram o CentOS 5, versão mais antiga do Apache e MySQL, e o Tomcat 5.X.

O Apache é o front-end, ele usa o AJP para se conectar a um back-end do Tomcat. A maior parte do tráfego será HTTPS.

O servidor é, acho que um servidor Gen 9 HP, tem 32 GB de RAM e SSDs em um array RAID 1. Depois de fazê-lo funcionar, agora estou preocupado em maximizar sua capacidade de atender aos usuários simultaneamente. Espero que uma explosão de várias centenas de usuários não seja incomum. Para esse fim, procurei evitar gargalos em qualquer ponto da pilha: começando com o Tomcat e o MariaDB e tomando medidas específicas para eles, medidas com as quais estou satisfeito. Passando para o Apache, porém, acho mais difícil entender o que devo fazer.

Existem 3 tipos diferentes de "trabalhadores" e eu tenho 3 grandes problemas para otimizá-los:
1. Existem três opções, prefork, mpm_worker e mpm_event. Eu realmente não entendo como configurá-los, embora eu tenha uma compreensão geral do que é usado para cada um. 2. Ao contrário do Apache nos servidores anteriores, as opções para StartServers, ServerLimit, MaxRequestsPerChild etc não estão listadas em /etc/httpd/conf/httpd.conf. Poderia haver configurações padrão que eu tenho que substituir manualmente? Existe alguma razão diferente de "eles foram adicionados manualmente da última vez" que as configurações seriam encontradas em um httpd.conf mais antigo, mas não em um novo?

Eu me refiro a isso, em um antigo httpd.conf, não consigo ver nada similar em nenhum lugar nos novos arquivos de configuração, apenas uma especificação:

// prefork MPM
// StartServers: number of server processes to start
// MinSpareServers: minimum number of server processes which are kept spare
// MaxSpareServers: maximum number of server processes which are kept spare
// ServerLimit: maximum value for MaxClients for the lifetime of the server
// MaxClients: maximum number of server processes allowed to start
// MaxRequestsPerChild: maximum number of requests a server process serves

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

// worker MPM
// StartServers: initial number of server processes to start
// MaxClients: maximum number of simultaneous client connections
// MinSpareThreads: minimum number of worker threads which are kept spare
// MaxSpareThreads: maximum number of worker threads which are kept spare
// ThreadsPerChild: constant number of worker threads in each server process
// MaxRequestsPerChild: maximum number of requests a server process serves

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

Observe que substituí os sinais de hash por // para significar comentários no httpd.conf, porque o sinal de hash faz com que o texto apareça como um título.

Em uma reversão do problema que tenho no novo servidor, não posso dizer qual trabalhador está sendo usado no antigo, há configurações para o prefork e mpm_worker, mas nenhuma especificação real de qual deve ser usada que eu pode achar.

  1. Depois de alguns ajustes, posso iniciar o servidor com mpm_worker se eu quiser (tenho que desabilitar um arquivo php.conf primeiro) mas não tenho certeza se os módulos controlando tudo são thread-safe (módulos para hosts virtuais, openssl, mod_proxy_ajp). mod_proxy_ajp é a única coisa que estou usando que seria em qualquer sentido incomum.

O servidor ainda não está em produção, então não tenho a opção de obter o uso médio de memória em grandes números de clientes atuais para ajudar a determinar o número "perfeito" de clientes máximos, além disso, não estou preocupado com um número perfeito, apenas um adequado.

Se eu quiser ter certeza de que aproximadamente ~ 400 pessoas talvez um pouco mais possam usar o servidor em um determinado momento, sem que ninguém veja erros do tipo http 500, quais são as configurações que devo usar para o Apache?

Obrigado antecipadamente, espero que isso não seja muito nooby.

    
por Sean W. 10.05.2016 / 13:47

1 resposta

8

Parece haver muitas perguntas possíveis aqui, um pouco desestruturadas para uma "resposta". Deixe-me ver se posso ajudar a responder algumas perguntas.

  • Determine quais módulos multiprocessamento (MPMs) estão em uso.

    A maneira "mais fácil" é descarregar qualquer módulo atualmente em execução e selecionar mpm para ver o que está sendo executado. Aqui estão dois métodos:

    # apachectl -M | grep mpm
    mpm_worker_module (shared)
    # httpd -V | grep MPM
    Server MPM:     worker
    
  • Alterar qual MPM está em uso

    No CentOS7, isso agora é controlado em um arquivo de configuração chamado /etc/httpd/conf.modules.d/00-mpm.conf . É um arquivo curto, e apenas um LoadModule deve ser descomentado a qualquer momento.

    LoadModule mpm_worker_module modules/mod_mpm_worker.so

    Uma reinicialização de serviço é necessária após a mudança para ativar o MPM desejado.

  • Defina os valores de configuração desejados

    Muitas das diretivas de configuração do módulo possuem padrões quando não são especificadas. StartServers using worker será o padrão 3, quando usar prefork = 5. Veja mais aqui: link . Eu recomendaria criar um novo arquivo para conter suas substituições, em vez de editar um existente.

    Algo como /etc/httpd/conf.modules.d/10-worker.conf :

    <IfModule mpm_worker_module>
        ServerLimit             250
        StartServers             10
        MinSpareThreads          75
        MaxSpareThreads         250
        ThreadLimit              64
        ThreadsPerChild          32
        MaxClients             8000
        MaxRequestsPerChild   10000
    </IfModule>
    

Como em qualquer coisa, o ajuste dos números exatos é deixado para você testar com suas cargas de trabalho e aplicativos - ferramentas como ab e siege podem ajudar.

por 10.05.2016 / 21:29