Então, tenho certeza de que isso já foi perguntado, mas quero ter certeza de que estou obtendo as informações corretas.
Estou rodando uma caixa 360 Linode com o Debian 5 e o Apache 2.2. Eu compilei tudo sozinho (sem apt-get). De vez em quando (uma vez a cada poucas semanas?), Meu servidor aleatoriamente "travava": ele disparava até 100% da CPU (na verdade 400%, mas você sabe o que eu quero dizer) e entregava a caixa. Você não conseguiu SSH para ver qual era o problema e o próprio servidor parou de aceitar conexões. A única maneira de consertá-lo era reiniciar a caixa.
Recentemente, começou a acontecer com relativa frequência: 24 horas, 12 horas, 10 horas, 8, 6, 4. Finalmente, consegui dar uma espiada logo antes de trancá-la dois dias atrás. Eu notei que o disco IO estava elevado e que quase não havia mais memória RAM! Além disso, havia uma carga de barcos de processos httpd rodando em 3-4% de RAM. E por carga de barco, quero dizer, quando eu fiz um ps -ef, eles ocuparam toda a tela. Se você rolou para cima, eles pegaram todo o buffer para o meu cliente SSH.
Então eu fiz alguns ajustes no meu código pensando que algo não estava fechando corretamente. Corrigi problemas de memória em meu PHP, ativei um registro de erros mais granular e corrigi vários erros, e isso pareceu ajudar em algum grau. As falhas voltaram a cada 24 horas.
Estou convencido de que isso é causado porque há muito pouca memória, e o volume de ocorrências que recebo está chutando meu servidor na troca. Como há tantas solicitações atingindo a troca, o disco IO dispara pelo telhado, fazendo com que o uso da CPU seja disparado pelo telhado, fazendo com que meu servidor trave.
Veja o que eu fiz para tentar corrigi-lo: eu fiz alguma pesquisa e descobri que provavelmente deveria estar usando o prefork. Eu olhei ao redor na minha configuração e não consegui encontrar nenhum ServerLimit ou MaxClients ou algo parecido, então eu adicionei alguns valores "padrão" e meu servidor se recusou a aceitar / qualquer / incoming conexões. Efetivamente, os valores do prefork bloquearam todo o tráfego HTTP de entrada sufocando a conexão (talvez porque meu servidor não seja capaz de lidar com o prefork? Idk).
Do jeito que eu vejo, o que meu servidor "costumava fazer" era bom, exceto que todo o processo do apache ficava pendurado e vazando memória. Existe alguma maneira de definir um tempo limite em processos do Apache ou colocar um limite em quantos deles existem? Parece muito burro que a melhor solução é usar o prefork; Eu tenho que imaginar que há uma maneira melhor.
Obrigado rapazes