O processo do Apache consome muita CPU

3

Eu tenho um servidor apache / php do ubuntu rodando php fazendo 100 acessos / seg de appx e um cron PHP rodando em segundo plano.

Ocasionalmente, recebo alta carga de CPU em um dos processos do Apache, que permanece alto, independentemente do tráfego ou da atividade do cron. Parece-me que está preso em algum tipo de loop ou algo assim.

Abaixo, você encontrará as informações de top e strace.

Como posso encontrar onde o código ruim está e o que causa isso?

top - 14:45:24 up 3 days,  3:38,  1 user,  load average: 5.10, 5.88, 5.85
Tasks: 163 total,   5 running, 158 sleeping,   0 stopped,   0 zombie
Cpu(s): 47.8%us, 18.5%sy,  0.0%ni, 10.2%id,  0.0%wa,  0.0%hi,  1.8%si, 21.6%st
Mem:   7885012k total,  3858484k used,  4026528k free,   177444k buffers
Swap:        0k total,        0k used,        0k free,  1037868k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10736 www-data  20   0  769m 559m 478m R   69  7.3  29:08.30 apache2
10844 www-data  20   0  824m 601m 492m S   17  7.8   4:37.90 apache2
 1016 root      20   0  242m  25m 4628 S    6  0.3 162:07.93 scalarizr
 9030 www-data  20   0  879m 619m 492m S    4  8.0   5:06.82 apache2
20216 www-data  20   0  747m 228m 170m S    4  3.0   0:01.94 apache2
10807 www-data  20   0  814m 584m 492m S    3  7.6   4:54.10 apache2
10455 www-data  20   0  831m 574m 492m S    3  7.5   4:32.65 apache2
10495 www-data  20   0  849m 592m 492m S    3  7.7   4:41.10 apache2
10884 www-data  20   0  840m 581m 492m S    3  7.6   4:25.06 apache2




^CProcess 10736 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 74.55    0.148052           1    109755           gettimeofday
 25.36    0.050370           0    164634           clock_gettime
  0.09    0.000178           0     54878           poll
------ ----------- ----------- --------- --------- ----------------
100.00    0.198600                329267           total
root@ec2-67-202-54-36:~# ^C
    
por Niro 03.10.2012 / 16:38

4 respostas

5

Eu recomendaria ativar o mod_status do Apache e ativar o ExtendedStatus. O Slicehost tem um excelente artigo sobre como realizar isso (eu usaria o pacote "elinks" vs. "lynx", mas isso é uma preferência pessoal). Quando você visualiza a URL de status do servidor Apache, haverá colunas PID, VHost e Request - elas devem percorrer um longo caminho para identificar o URI que está sendo chamado, que você pode usar para rastrear o código específico que está sendo executado. .

Aqui está uma versão personalizada do artigo do Slicehost para ativar o mod_status:

sudo apt-get install elinks
sudo /usr/sbin/a2enmod status
sudo sh -c "echo 'ExtendedStatus On' > /etc/apache2/conf.d/extendedstatus"
sudo vi /etc/apache2/sites-available/server-status

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from localhost
</Location>

sudo /usr/sbin/a2ensite server-status
sudo apachectl configtest
sudo service apache2 reload

Em seguida, para visualizar o status do servidor:

elinks -dump -dump-width 256 http://localhost/server-status
    
por 09.10.2012 / 16:40
1

Santo Mahoney! Seu Apache parece consumir muita memória. O que diabos está acontecendo? Há toneladas de módulos do Apache carregados? Você tem o mod_security com regras não tão fáceis de usar? Seu site está executando algo do inferno como Magenta? Além disso, algo realmente torna seu script PHP realmente curioso sobre a hora atual. : D

Bem, de qualquer forma, para o perfil PHP você pode usar XDebug e analisar os resultados, por exemplo KCacheGrind , que mostra os resultados em forma gráfica fácil de ler.

Para analítica de desempenho em tempo real, as distros modernas do Linux têm o comando perf , é como o tradicional top , mas você pode detalhar processos únicos e se estiver disposto, você pode ver no nível da montagem o que está acontecendo.

    
por 11.10.2012 / 18:20
0

Você deve usar um depurador, por exemplo, xdebug , para percorrer seu programa e localizar o loop infinito.

    
por 09.10.2012 / 17:55
0

Existem várias opções que você pode usar para isolar seu problema.

Obviamente, você deseja verificar seus registros e identificar se há algum problema relatado.

/var/log/access_log 
/var/log/php_error
/var/log/error_log

Pressionar C enquanto a parte superior está em execução também fornecerá dados adicionais sobre os processos em execução com uma cpu tão alta

Como o dialtOne mencionou, você pode instalar o mod_status para obter detalhes adicionais também.

Não sei ao certo como você está usando o php, mas a instalação do memcache e da APC nas máquinas proporcionará uma economia adicional de recursos. Com o memcache, você precisará configurar seu código para verificar primeiro os caches das pesquisas do banco de dados. Isso pode economizar uma grande quantidade de sobrecarga em sites acessados com muitas pesquisas de banco de dados recorrentes.

Ajustar sua configuração de memória no php e no que seu banco de dados usa também pode ajudar no controle de cargas.

Isto está no seu php.ini e qualquer que seja o seu arquivo de configuração do banco de dados.

Se você estiver usando chamadas de banco de dados, poderá procurar consultas lentas.

Outras opções estão expandindo seus processos filhos e o número de processos por filho que podem ser configurados no httpd.conf.

Um carregamento de 5 não é o pior, dependendo de quantos processadores você possui. Alguns de nossos maiores servidores da web já viram cargas muito altas antes e o site ainda é entregue bem. É realmente quanto de energia você quer gastar mexendo no site.

Boa sorte!

    
por 09.10.2012 / 17:42