![Apache 2.2 eventualmente usando toda a memória (worker mpm)](https://rvso.com/image/632747/Apache%202.2%20eventualmente%20usando%20toda%20a%20mem%C3%B3ria%20(worker%20mpm).png)
Estou ajustando um servidor Apache 2.2 (é compartilhado com MySQL + Courier + Mongo + Postgre). O servidor é bare metal (sem virtualização) com 2 Xeon quad-core (total de 16 núcleos) e 12 GB de RAM ECC (atualizando para 24 GB nos próximos dias). MySql tem innodb_buffer definido como 2G e está indo bem. Mongo e Postgre quase não são tocados - apenas para desenvolvimento.
O problema é que o Apache está consumindo toda a memória disponível, eventualmente usando toda a troca (e, portanto, travando o MySql, pois está usando mais memória). Temos Apache 2.2 com trabalhador MPM e mod_security. Sempre que o reiniciamos, temos aproximadamente 8G de RAM livre.
Estou tentando entender algumas coisas:
- Qual a relação entre os processos mostrados
top
com os servidores trabalhadores? Eu esperava ver no máximo 10 processos (como o ServerLimit nas configurações do trabalhador - sem levar em conta o processo principal). - A quantidade de memória RES é usada para cada THREAD ou para cada PROCESS?
- Na saída mod_status abaixo, há muitas solicitações de READING que permanecem lá por muito tempo. Tentei ativar o ExtendedStatus para descobrir quais clientes existem, mas não consegui encontrar nenhuma informação útil. Alguma sugestão?
- com o uso real de memória, que quantidade de RAM eu precisaria para atender 400 conexões simultâneas? (já que o status do mod mostra 250 já esgotados)
- que tal aumentar ThreadsPerChild em vez de aumentar MaxClients/ServerLimit?
<IfModule trabalhador.c> StartServers 2 MaxClientes 250 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 Limite de servidor 10 </IfModule>
Principais programas (apenas para apache):
topo - 16:30:21 até 46 dias, 23:12, 2 usuários, média de carga: 0,94, 0,97, 1,31 Tarefas: 460 no total, 1 correndo, 459 dormindo, 0 parado, 0 zumbi CPU(s): 2,8%us, 0,5%sy, 0,0%ni, 96,7%id, 0,0%wa, 0,0%hi, 0,0%si, 0,0%st Mem: 12187448k no total, 10686748k usados, 1500700k livres, 67104k buffers Troca: 1.048.568 mil no total, 275.904 mil usados, 772.664 mil gratuitos, 2.371.208 mil em cache PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24252 wwwrun 20 0 2216m 161m 7484 S 20,2 1,4 0:09,25 httpd 24750 wwwrun 20 0 1264m 51m 6196 S 9,9 0,4 0:00,93 httpd 23996 wwwrun 20 0 2136m 279m 7292 S 6,0 2,4 0:16,76 httpd 23326 wwwrun 20 0 2216m 276m 7376 S 2,7 2,3 0:16,81 httpd 23582 wwwrun 20 0 2208m 293m 7132 S 2,3 2,5 0:27,30 httpd 23688 wwwrun 20 0 1904m 208m 7304 S 1.0 1.8 0:13.62 httpd 19507 wwwrun 20 0 2182m 229m 8096 S 0,7 1,9 0:18,65 httpd 23616 wwwrun 20 0 1908m 239m 7092 S 0,7 2,0 0:18,48 httpd 18304 wwwrun 20 0 2160m 334m 11m S 0,3 2,8 0:47,38 httpd 23637 wwwrun 20 0 1830m 231m 7556 S 0,3 1,9 0:20,56 httpd 24457 wwwrun 20 0 2196m 174m 6568 S 0,3 1,5 0:04,11 httpd 15694 wwwrun 20 0 2199m 295m 7504 S 0,0 2,5 0:20,54 httpd 15783 wwwrun 20 0 2172m 244m 10m S 0,0 2,1 0:17,45 httpd 16577 wwwrun 20 0 2128m 354m 7436 S 0,0 3,0 0:28,21 httpd 18290 wwwrun 20 0 277m 9880 964 S 0,0 0,1 0:00,05 httpd 18379 wwwrun 20 0 2208m 211m 6864 S 0,0 1,8 0:08,57 httpd 18480 wwwrun 20 0 2096m 305m 7540 S 0,0 2,6 0:17,72 httpd 18791 wwwrun 20 0 1920m 251m 7244 S 0,0 2,1 0:20,24 httpd 19348 wwwrun 20 0 2060m 310m 7388 S 0,0 2,6 0:22,07 httpd 19619 wwwrun 20 0 2206m 235m 7340 S 0,0 2,0 0:15,30 httpd 19999 wwwrun 20 0 2178m 144m 7132 S 0,0 1,2 0:05,50 httpd 20697 wwwrun 20 0 2002m 193m 7276 S 0,0 1,6 0:08,12 httpd 20838 wwwrun 20 0 1890m 127m 7260 S 0,0 1,1 0:07,44 httpd 21407 wwwrun 20 0 1988m 290m 7708 S 0,0 2,4 0:39,33 httpd 22252 wwwrun 20 0 2216m 295m 7732 S 0,0 2,5 0:27,04 httpd 22723 wwwrun 20 0 2020m 187m 7444 S 0,0 1,6 0:39,80 httpd 22753 wwwrun 20 0 1850m 206m 7448 S 0,0 1,7 0:10,62 httpd 23174 wwwrun 20 0 1990m 229m 7332 S 0,0 1,9 0:07,71 httpd 23383 wwwrun 20 0 1504m 76m 6372 S 0,0 0,6 0:01,25 httpd 23720 wwwrun 20 0 1906m 225m 7080 S 0,0 1,9 0:20,12 httpd 24778 wwwrun 20 0 970m 30m 5604 S 0,0 0,3 0:00,80 httpd
Finalmente, saída mod_status:
Versão do servidor: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/1.0.0-fips Servidor de domínio PHP/5.3.24 com Suhosin-Patch mod_perl/2.0.5 Perl/v5.10.1 Servidor construído: 15 de maio de 2013 10:17:30 _______________________________________________________________________________________________________________________________ Hora atual: Segunda-feira, 12 de maio de 2014 16:41:08 BRT Horário de reinicialização: segunda-feira, 12 de maio de 2014, 15:36:37 BRT Geração de servidor pai: 1 Tempo de atividade do servidor: 1 hora 4 minutos 31 segundos Acessos totais: 36.446 - Tráfego total: 1,6 GB Uso da CPU: u213.3 s13.65 cu0 cs0 - 5,86% de carga da CPU 9,42 solicitações/seg - 442,8 kB/segundo - 47,0 kB/solicitação 249 solicitações em processamento no momento, 0 trabalhadores ociosos WWRRKRKRRKRRRRWRRWWWRWCRR........................................ RWWWRRWRRRRKKRKRWRRRRRWWR........................................ WRWRCRRWRRWWRKRRWWRRWRWWW........................................ WRWKKWWWRWKRRWRCRRRWWRWWW........................................ WRWRWCRKCWWWRWWRRWWCRWRWW........................................ WRWKRWRRKKRKRRRRCWWKWWWRW........................................ RWWKWRRWKRRRWRRWWCRRRRRRW........................................ WWWRRWRKWWWKRWWWWRWWWKRRW........................................ RRRRRRRK.WKRRWRWWKRRWRRKR........................................ KCRRRRWRWWKRWWWRRKWRWRWRK.......................................
Atualização 1:
Tentei desabilitar o mod_security2, mexi nas configurações do trabalhador, mas eventualmente o Apache consumiria quase 20G de RAM (adicionei um arquivo de troca de 13G para evitar travamento do servidor).
Por fim, desativei o KeepAlive e mantive MaxRequestsPerChild em 100 - agora o Apache está usando 2-3G e as solicitações estão sendo limpas, conforme saída de status abaixo:
Hora atual: terça-feira, 13 de maio de 2014 17:07:48 BRT Horário de reinicialização: terça-feira, 13 de maio de 2014, 16:49:14 BRT Geração do servidor pai: 0 Tempo de atividade do servidor: 18 minutos e 33 segundos Acessos totais: 6.637 - Tráfego total: 133,2 MB Uso da CPU: u34.43 s3.05 cu0 cs0 - 3,37% de carga da CPU 5,96 solicitações/seg - 122,5 kB/segundo - 20,5 kB/solicitação 14 solicitações sendo processadas atualmente, 86 trabalhadores ociosos ...................R................................ .............. ________________RR__R_R__RC_RWC___________________.............. R_WC__R___R_______________________________________.............. .................................................. .............. .................................................. .............. .................................................. .............. .................................................. .............. .................................................. .............. .................................................. .............. .................................................. ..............
Responder1
KeepaliveTimeout
ajudaria a reduzir os trabalhadores "lidos" suspensos.
O MPM usa vários processos com vários threads para lidar com o tráfego de entrada, então o que você está vendo é uma operação normal do Apache.
Este ajuste padrão pode funcionar melhor para suas necessidades:
ServerLimit 12
StartServers 2
MaxClients 500
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50
Isso causaria a geração de um total de 10 processos ( MaxClients
/ ThreadsPerChild
), o que reduziria significativamente o consumo de memória do seu servidor. Você pode pagar mais threads em menos processos devido à disponibilidade da CPU.
Observe que a alteração dessas variáveis exige que o Apache seja totalmente interrompido e reiniciado.
Responder2
Qual a relação entre os processos mostrados acima com os servidores trabalhadores? Eu esperava ver no máximo 10 processos (como o ServerLimit nas configurações do trabalhador - sem levar em conta o processo principal).
Isso não se parece com top
um servidor Apache executando o MPM de trabalho. Estou executando dois servidores, um com o MPM de trabalho e outro com o MPM pré-fork. Com o trabalhador, top
lista os processos do Apache como httpd.worker
e o número de processos corresponde ao número de servidores ativos (linhas de pontos com algumas entradas sem pontos) visíveis via mod_status. Com o prefork, os processos são listados como httpd
e o número corresponde aproximadamente ao número de trabalhadores ociosos/ativos (cada entrada sem ponto).
Então, dada esta saída mod_status:
..................R.............................................
..............._RR__R_R__RC_RWC__...............................
R_WC__R___R_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
top
em um servidor executando o prefork deve mostrar aproximadamente 31 httpd
processos, e top
em um servidor executando o trabalhador deve mostrar 3 httpd.worker
processos.