Estou usando o SpamAssassin no Debian (a configuração padrão com Pyzor, AWL e Bayes desabilitados e com compilação sa habilitada), e cada um dos processos filhos de spam consome de 100 a 150 MB de memória (cerca de 50 MB de memória real) nos 32 servidores de bits e quase o dobro disso (logicamente) nos servidores de 64 bits. Geralmente, existem dois processos filhos, mas nos horários de pico pode haver cinco (no máximo) em execução.
ISTM que 200 a 600MB é muita memória para esta tarefa. Gostaria de continuar usando o SA como parte da minha estrutura de filtragem, mas está se tornando difícil justificar tanta memória.
Existem maneiras de reduzir a quantidade de memória que cada processo filho usa? (Ou, alternativamente, faça um processo filho único tão rápido que eu possa definir o número máximo de filhos para algo como 2?). Estou disposto a considerar todas as opções, incluindo aquelas que resultarão ou poderão resultar em menor precisão.
Eu já li a página "Problemas de falta de memória" no wiki do SA ; nada existe de alguma utilidade. Mensagens maiores que 5 MB não são verificadas com o SA.
fonte
Respostas:
Acho que você está entendendo mal a maneira como o Linux relata o uso de memória. Quando um processo bifurca, resulta em um segundo processo que compartilha muitos recursos com o processo original. Incluído nisso é a memória. No entanto, o Linux usa uma técnica conhecida como Copy On Write (COW) para isso. O que isso significa é que cada processo filho bifurcado verá os mesmos dados na memória que o processo original, mas sempre que esses dados forem alterados (pelo filho ou pai), as alterações serão copiadas e somente então apontarão para um novo local.
Até que um dos processos faça alterações nesses dados, eles estão compartilhando a mesma cópia. Como resultado, eu poderia ter um processo que usa 100 MB de RAM e bifurcá-lo 10 vezes. Cada um desses processos bifurcados mostraria 100 MB de RAM sendo usados, mas se você observar o uso geral de memória na caixa, poderá mostrar apenas que 130 MB de RAM estão sendo usados (100 MB compartilhados entre os processos, mais alguns MB de sobrecarga , além de mais uma dúzia de MB ou dois para o restante do sistema).
Como exemplo final, eu tenho uma caixa agora com 30 processos apache em execução. Cada processo está mostrando um uso de 22MB de RAM. No entanto, quando executo free -m para mostrar meu uso geral de RAM, recebo:
Como você pode ver, essa caixa nem sequer tem RAM suficiente para executar 30 processos que usavam 18 MB de RAM "real". A menos que você esteja literalmente ficando sem memória RAM ou seus aplicativos estejam trocando bastante, eu não me preocuparia com as coisas.
ATUALIZAÇÃO: Além disso, confira esta ferramenta chamada smem , mencionada por jldugger na resposta a outra pergunta sobre o uso da memória Linux aqui .
fonte
Usando o sa-compile, você poderá melhorar a velocidade de correspondência de muitas regras.
fonte
Aqui está o que eu fiz.
Tenho uma configuração em que muitas mensagens tendem a ser entregues aproximadamente ao mesmo tempo; para uma série de experimentos, executo o SA em mensagens que são copiadas para um spool temporário e entregues por um trabalho cron a cada cinco minutos.
spamd
continuaria imprimindo "talvez você deva aumentar o parâmetro max-children" e eu o levantei para 40 a certa altura, mas o servidor estava consumindo todo o espaço de troca e travando.Agora eu implementei um regime diferente em que a entrega é governada por um arquivo de bloqueio do Procmail. Por ser simples, basta usar o último dígito do ID do processo e executar com 10 filhos. Não tenho certeza se isso é ideal, mas já ajudou a evitar os picos de carga insanos que eu envolvia a experiência de tempos em tempos.
Além disso, inicio
spamd
com váriasulimit
restrições. Os números foram retirados de http://svn.apache.org/repos/asf/spamassassin/trunk/contrib/run-masses, exceto que eu removi aulimit -u
restrição. (Não tenho certeza do que está acontecendo. 32 é muito pequeno em qualquer caso. Com algo como 500, eu poderia continuarspamd
correndo por um tempo, mas eventualmente chegando ao limite.)Acho que vou acabar com falhas na entrega se a carga for muito alta por um período prolongado, mas até agora, parece que consegui reduzir a carga para níveis gerenciáveis com isso; e um monte de entregas com falha ainda é muito melhor do que a máquina ficando sem troca.
fonte
As médias de carga alta (às vezes) são um sintoma indireto de que sua máquina está ficando sem memória RAM (e usando muitos processos de troca de CPU na memória virtual), portanto, você pode tentar configurar o servidor de correio para não passar mensagens através do SpamAssassin se o as médias de carga são muito altas.
Você não menciona qual MTA está executando, mas se estiver chamando o SA de uma lista de controle de acesso no exim4, a sugestão na parte inferior desta mensagem será efetiva.
Além disso, você pode aliviar a carga no SA e, assim, reduzir o uso de memória, colocando outros métodos de filtragem de spam com pouco uso de recursos à sua frente (ou seja, para que eles processem e rejeitem algum spam antes de chegar ao SA) - por exemplo, as frases de lista cinza e a verificação de remetente usam relativamente pouca RAM.
fonte
Nós estávamos em uma situação semelhante há vários meses. O SpamAssassin e o ClamAV estavam usando muita memória em um servidor hospedado. Tivemos a opção de adicionar mais memória ao servidor, mas acabou sendo mais econômico e econômico mudar para o Postini. YMMV.
fonte