Como minimizar o uso da memória SpamAssassin (spamd)

14

Estou usando o SpamAssassin no Debian (a configuração padrão com Pyzor, AWL e Bayes desativados e sa-compile ativado) e cada um dos processos filho spamd consome cerca de 100 a 150 MB de memória (cerca de 50 MB de memória real) nos servidores de 32 bits e aproximadamente o dobro disso (logicamente) nos servidores de 64 bits. Geralmente existem dois processos filhos, mas em horários de maior movimento pode haver cinco (o máximo) em execução.

ISTM que 200 a 600MB é muita memória para esta tarefa. Eu gostaria de continuar usando SA como parte da minha estrutura de filtragem, mas está ficando difícil justificar tanta memória.

Existe alguma maneira de reduzir a quantidade de memória que cada processo filho usa? (Ou, alternativamente, fazer um processo único filho tão rápido que eu possa definir o máximo de crianças para algo como 2?). Estou disposto a considerar quaisquer opções, incluindo aquelas que resultem ou possam resultar em precisão reduzida.

Eu já li a página "Problemas com falta de memória" no wiki do SA ; nada há de alguma utilidade. Mensagens maiores que 5 MB não são verificadas com SA.

    
por Tony Meyer 04.05.2009 / 11:20

5 respostas

5

Acho que você está entendendo mal o modo como o Linux relata o uso da memória. Quando um processo se bifurca, resulta em um segundo processo que compartilha muitos recursos com o processo original. Incluído nisso está 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 só então apontarão para um novo local.

Até que um dos processos faça alterações nesses dados, eles compartilham a mesma cópia. Como resultado, eu poderia ter um processo que usa 100MB de RAM e bifurcar 10 vezes. Cada um desses processos bifurcados mostraria 100MB de RAM sendo usados, mas se você observasse o uso geral da memória na caixa, isso poderia mostrar apenas 130MB de RAM (100MB compartilhados entre os processos, além de alguns MB de sobrecarga , mais outra dúzia de MB ou dois para o resto do sistema).

Como último exemplo, 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:

topher@crucible:/tmp$ free -m
             total       used       free     shared    buffers     cached
Mem:           349        310         39          0         24         73
-/+ buffers/cache:        212        136
Swap:          511         51        460

Como você pode ver, esta caixa não tem RAM suficiente para rodar 30 processos, cada um usando 18MB de RAM "real". A menos que você esteja literalmente ficando sem RAM ou seus aplicativos estejam trocando muito, eu não me preocuparia com as coisas.

UPDATE: Além disso, confira esta ferramenta chamada smem , mencionada por jldugger na resposta a outra pergunta sobre o uso da memória do Linux aqui .

    
por 04.05.2009 / 17:04
1

Ao usar sa-compile , talvez seja possível melhorar a velocidade de correspondência de muitas regras.

    
por 04.05.2009 / 12:41
1

Veja o que eu fiz.

Eu tenho um set-up onde muitas mensagens tendem a ser entregues mais ou menos ao mesmo tempo; para uma série de experimentos, executo o SA em mensagens que são copiadas para um spool temporário e, em seguida, entregues por um cron job a cada cinco minutos.

spamd continuaria imprimindo "talvez você devesse aumentar o parâmetro max-children" e eu aumentei para 40 em um ponto, mas o servidor consumiu todo o seu espaço de troca e travamento.

Agora, implementei um regime diferente, no qual a entrega é regida por um arquivo de bloqueio do Procmail. Por ser simples de fazer, uso apenas o último dígito do ID do processo e executo 10 filhos. Não tenho certeza se isso é o ideal, mas já ajudou a evitar os picos de carga insanos que eu experimentei de tempos em tempos.

LINEBUF=10240

# Grab last digit of PID for lockfile
PID=$$
:0
* PID ?? ()\/[0-9]$
{ D=$MATCH }
:0
* > 512000
{ SA="(too large)" }
:0Ew:/tmp/20spamc.$D
SA=| spamc -p 38783 -l -y

Além disso, eu inicio spamd com um número de restrições ulimit . Os números foram retirados do link , exceto que removi a restrição ulimit -u . (Não sei ao certo o que está acontecendo. 32 é muito pequeno em qualquer evento. Com algo como 500 eu poderia manter spamd rodando por um tempo, mas eventualmente chegando ao limite.)

ulimit -v 204800
ulimit -m 204800
ulimit -n 256
#ulimit -u 32

perl -T -I lib -w spamd --min-children 2 --max-children 10 --max-spare 5 etc etc

Eu acho que vou acabar com falhas de entrega se a carga estiver muito alta por um longo tempo, 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 que está ficando sem swap.

    
por 19.11.2012 / 09:45
0

Altas médias de carga são (às vezes) um sintoma indireto de que sua máquina está ficando sem RAM (e usando muitos processos de troca de CPU da memória virtual), então você pode tentar configurar seu servidor de e-mail para não passar e-mails SpamAssassin se as médias de carga forem muito altas.

Você não menciona qual MTA está sendo executado, mas se estiver chamando SA de uma lista de controle de acesso no exim4, a sugestão na parte inferior de esta mensagem é eficaz.

Além disso, você pode aliviar a carga de SA e, assim, reduzir o uso de memória, colocando outros métodos de filtragem de spam menos intensivos em recursos (ou seja, processando e rejeitando alguns spams antes que eles cheguem) SA) - por exemplo, greylisting e remetente verificam callouts usam relativamente pouca RAM.

    
por 29.07.2009 / 22:21
0

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 eficiente em termos de custo e tempo para alternar para o Postini. YMMV.

    
por 30.07.2009 / 01:05