it-swarm-pt.tech

Como minimizar o uso de memória do SpamAssassin (spamd)

Estou usando SpamAssassin no Debian (a configuração padrão com Pyzor, AWL e Bayes desabilitados e sa-compile habilitado), 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) no 32 servidores de bits e cerca do dobro (logicamente) nos servidores de 64 bits. Geralmente, há dois processos filho, mas em horários de pico, podem haver cinco (no máximo) em execução.

ISTM que 200 a 600 MB é muita memória para essa 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, faça um único processo filho tão rápido que eu possa definir o máximo de filhos para algo como 2?). Estou disposto a considerar quaisquer opções, incluindo aquelas que irão ou podem resultar em precisão reduzida.

Eu já li a página "Problemas de falta de memória" na SA wiki ; nada lá é útil. Mensagens maiores que 5 MB não são verificadas com SA.

15
Tony Meyer

Acho que você está entendendo mal a maneira como o Linux relata o uso de memória. Quando um processo se bifurca, isso resulta em um segundo processo que compartilha muitos recursos com o processo original. Incluída 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 são copiadas e só então apontam 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ê olhar para o uso geral de memória na caixa, pode mostrar apenas que 130 MB de RAM estão sendo usados ​​(100 MB compartilhados entre os processos, mais alguns MB de sobrecarga, mais outra dúzia ou dois MB para o resto do sistema).

Como um exemplo final, eu tenho uma caixa agora com 30 processos Apache em execução. Cada processo está mostrando um uso de 22 MB de RAM. No entanto, quando executo free -m para mostrar meu uso geral de RAM, obtenho:

[email protected]:/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 nem mesmo tem RAM suficiente para executar 30 processos que estavam usando cada um 18 MB de RAM "real". A menos que você esteja literalmente ficando sem RAM ou seus aplicativos estejam trocando pesadamente, eu não me preocuparia com as coisas.

ATUALIZAÇÃO: Além disso, verifique esta ferramenta chamada smem , mencionada por jldugger na resposta a outra pergunta sobre o uso de memória do Linux aqui .

5
Christopher Cashell

Usando sa-compile você poderá melhorar a velocidade de correspondência de muitas regras.

1
David Schmitt

Aqui está o que eu fiz.

Eu tenho uma configuração em que muitas mensagens tendem a ser entregues quase ao mesmo tempo; para uma série de experimentos, eu executo SA em mensagens que são copiadas para um spool temporário e depois entregues por um cron job a cada cinco minutos.

spamd continuaria imprimindo "talvez você deva aumentar o parâmetro max-children" e eu o fiz aumentar para 40 em um ponto, mas o servidor estava consumindo todo o seu espaço de swap e travando.

Agora, implementei um regime diferente em que a entrega é controlada por um arquivo de bloqueio Procmail. Como era simples de fazer, eu apenas uso o último dígito da ID do processo e executo com 10 filhos. Eu não tenho certeza se isso é o ideal, mas já ajudou a evitar os picos de carga insanos que eu experimentei de vez em quando.

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, iniciei spamd com várias restrições ulimit. Os números foram retirados de http://svn.Apache.org/repos/asf/spamassassin/trunk/contrib/run-masses exceto eu removi o ulimit -u restrição. (Não tenho certeza do que está acontecendo. 32 é muito pequeno em qualquer evento. Com algo como 500, eu poderia manter spamd funcionando 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

Acho que vou acabar com falhas de entrega se a carga ficar muito alta por um longo tempo, mas até agora, parece que consegui reduzir a carga a níveis administráveis ​​com isso; e um monte de entregas com falha ainda é muito melhor do que a máquina ficando sem swap.

1
tripleee

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 para frente e para trás da memória virtual), então você pode tentar configurar seu e-mail servidor para não passar mensagens através do SpamAssassin se as médias de carregamento forem muito altas.

Você não menciona qual MTA está executando, 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 no SA e, assim, reduzir seu uso de memória, colocando alguns outros métodos de filtragem de spam com menos recursos (ou seja, para que eles processem e rejeitem algum spam antes que chegue ao SA) - por exemplo, as chamadas de lista cinza e de verificação do remetente usam relativamente pouca RAM.

0
David North

Estávamos em uma situação semelhante há vários meses. SpamAssassin e ClamAV estavam usando muita memória em um servidor hospedado. Tínhamos a opção de adicionar mais memória ao servidor, mas acabou sendo mais econômico e econômico mudar para o Postini. YMMV.

0
Gerald Combs