Como descobrir quanto RAM cada thread prefork requer para o desempenho máximo do Wordpress em uma pequena instância do EC2

2

Basta ler Como tornar o WordPress estável em EC2-Micro

Na seção "Tuning Apache", não consigo descobrir como ele cria seus números para a configuração do prefork.

Ele explica como obter os números de um processo médio, o que eu recebo. Mas então:

Or roughly 53MB per process...In this case, ten threads should be safe. This means that if we receive more than ten simultaneous requests, the other requests will be queued until a worker thread is available. In order to maximize performance, we will also configure the system to have this number of threads available all of the time.

A partir de 53MB por processo, com 613MB de RAM, ele de alguma forma obtém essa configuração, o que eu não entendo:

<IfModule prefork.c>
 StartServers       10
 MinSpareServers    10
 MaxSpareServers   10
 MaxClients       10
 MaxRequestsPerChild  4000
</IfModule>

Como exatamente ele consegue isso de 53MB por processo, com limite de 613MB?

Pergunta bônus

A partir do abaixo, em uma pequena instância (1,7 GB de memória), quais seriam as boas configurações?

bitnami@ip-10-203-39-166:~$ ps xav |grep httpd
 1411 ?        Ss     0:00      2     0 114928 15436  0.8 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1415 ?        S      0:06     10     0 125860 55900  3.1 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1426 ?        S      0:08     19     0 127000 62996  3.5 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1446 ?        S      0:05     48     0 131932 72792  4.1 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1513 ?        S      0:05      7     0 125672 54840  3.1 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1516 ?        S      0:02      2     0 125228 48680  2.7 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1517 ?        S      0:06      2     0 127004 55796  3.1 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1518 ?        S      0:03      1     0 127196 54208  3.0 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1531 ?        R      0:04      0     0 127500 54236  3.0 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
    
por two7s_clash 28.03.2012 / 06:31

2 respostas

5

A idéia por trás do cálculo é que você precisa manter alguma memória para outras coisas - o sistema operacional e outros serviços em execução na instância. Depois disso, o que quer que você tenha, você divide pela memória média usada (tamanho do conjunto de residentes - coluna RSS) para obter o número máximo de threads que seu servidor pode manipular sem ficar sem memória.

Dito isso, eu gosto de fazer o meu cálculo de maneira um pouco diferente, mas vou abordar isso mais tarde.

A partir do httpd.conf:

prefork MPM

  • StartServers: número de processos do servidor para iniciar
  • MinSpareServers: número mínimo de processos do servidor que são mantidos livres
  • MaxSpareServers: número máximo de processos do servidor que são mantidos livres
  • ServerLimit: valor máximo para MaxClients durante a vida útil do servidor
  • MaxClients: número máximo de processos do servidor com permissão para iniciar
  • MaxRequestsPerChild: número máximo de solicitações que um processo do servidor exibe

A configuração que você mostrou manterá 10 processos em execução constantes: você inicia 10 processos (StartServers) e tem no máximo 10 processos de servidor permitidos (MaxClients). Nesse caso, os MinSpareServers e MaxSpareServers não devem entrar em jogo. Depois que um processo do servidor atender a 4.000 solicitações, ele será finalizado e um novo será criado em seu lugar (para tentar limitar vazamentos de memória, etc.)

Assim, a suposição feita é que tudo o mais no seu servidor usará cerca de 80MB de memória - deixando-o com 530MB. Divida isso pelo tamanho médio do processo (53MB) para obter 10 processos.

Eu sugeriria que a suposição está um pouco errada. Se você estiver executando qualquer outra coisa (por exemplo, MySQL) no servidor, você definitivamente precisa manter mais memória na reserva. Além disso, não há espaço para a variação incluída. Para a estimativa, deixo pelo menos 120 MB para o sistema operacional e outros serviços e, em seguida, reduzo o restante em 10% para a variação. Então, cerca de 8 processos apache max.

<IfModule prefork.c>
 StartServers       2
 MinSpareServers    1
 MaxSpareServers   3
 MaxClients       8
 MaxRequestsPerChild  1000
</IfModule>

Assim, com o acima - há um máximo de 8 processos. Estamos apenas começando 2. Gostaríamos que pelo menos um ocioso a qualquer momento - mas não mais que 3 ocioso. Além disso, como a memória é um problema, a MaxRequestsPerChild foi reduzida.

Agora, eu prefiro calcular o número executando um pouco o servidor, depois parando o apache e vendo quanta memória o resto do sistema está usando. Subtraia esse número do total, tome 90% e divida pelo tamanho médio do processo do apache. Especialmente para configurações mais complexas, isso dá um valor mais realista.

Como ponto de referência, em uma caixa restrita de memória, o Nginx provavelmente é preferível ao Apache como um servidor da web. Além disso, você definitivamente deseja algum espaço de troca em um t1.micro (embora você não deva se encontrar usando muito).

    
por 28.03.2012 / 13:26
1

A configuração de MinSpareServers para o mesmo valor que MaxSpareServers não faz muito sentido - em vez disso, anula a finalidade de suportar histerese para gerenciamento de demanda.

Eu não vejo uma seção de 'ajuste de apache' no post que você mencionou. O que eu vejo não parece fornecer qualquer explicação de como o autor mediu a pegada do servidor. Veja esta pergunta e respostas .

Um keepAliveTimeout de 5 parece ridiculamente alto - e nenhuma explicação é oferecida para isso também.

Não vejo a lógica por trás da configuração de maxKeepAliveRequests para "cerca de dois terços de MaxClients"

Assumindo um processo médio de 53Mb (que parece bastante grande para mim) e 613Mb de memória livre , eu começaria com algo como:

keepAliveTimeout 1
maxKeepAliveRequests 15

<IfModule prefork.c>
   StartServers       5
   MinSpareServers    2
   MaxSpareServers    4
   MaxClients        10
   MaxRequestsPerChild  4000
</IfModule>

Mas se você tiver muitos arquivos estáticos referenciados em cada página, talvez seja necessário forçar mais servidores a serem executados.

A configuração maxrequestsperchild de 1000 provavelmente é OK.

    
por 28.03.2012 / 14:03