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


15

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.


1
Observe que crianças bifurcadas podem usar muito menos RAM física do que a soma dos números ps ou top show. Isso ocorre devido à estratégia de copiar na gravação durante a bifurcação.
David Schmitt

Respostas:


5

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:

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, 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 .


1
Estou literalmente ficando sem memória RAM, então preciso me preocupar com isso. No entanto, pode ser que outros processos estejam consumindo a RAM e a SA não esteja usando tanto.
611 Tony Meyer

Pela minha observação e usando o smem da ferramenta , parece que o spamassassin usa cerca de 50 MB de RAM e, se você o dividir em vários processos, quase toda a memória deles é compartilhada, então ainda usará cerca de 50 MB de RAM total entre todos os processos, embora o ps reporte cada um com um RSS de 50 MB. YMMV.
thomasrutter

1

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


Desculpe, eu deveria ter mencionado na pergunta que eu já estou usando o sa-compile. Boa sugestão, no entanto.
611 Tony Meyer

1

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.

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, inicio spamdcom várias ulimitrestrições. Os números foram retirados de http://svn.apache.org/repos/asf/spamassassin/trunk/contrib/run-masses, exceto que eu removi a ulimit -urestrição. (Não tenho certeza do que está acontecendo. 32 é muito pequeno em qualquer caso. Com algo como 500, eu poderia continuar spamdcorrendo 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 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.


0

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.


Em uma nota relacionada, estou pensando seriamente em abandonar o SA em favor do dspam em alguns servidores que eu corro, pois o dspam supostamente tem menos fome de RAM.
31420 David North

Como meio termo, você pode executar um filtro bayesiano como primeiro passo e voltar ao SpamAssassin apenas para as mensagens para as quais o primeiro filtro não apresentou um veredicto claro. Spammers tendem a se repetir muito, então você provavelmente poderia lidar com a grande maioria dos casos sem SpamAssassin, mas ainda tê-lo disponível para novos surtos etc.
tripleee

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 econômico e econômico mudar para o Postini. YMMV.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.