it-swarm-es.com

Cómo minimizar el uso de memoria de SpamAssassin (spamd)

Estoy usando SpamAssassin en Debian (la configuración predeterminada con Pyzor, AWL y Bayes deshabilitados y sa-compile habilitado), y cada uno de los procesos secundarios spam consume alrededor de 100 a 150 MB de memoria (alrededor de 50 MB de memoria real) en el 32 servidores de bits, y aproximadamente el doble (lógicamente) en los servidores de 64 bits. En general, hay dos procesos secundarios, pero en las horas punta puede haber cinco (el máximo) en ejecución.

ISTM que 200 a 600 MB es mucha memoria para esta tarea. Me gustaría seguir usando SA como parte de mi estructura de filtrado, pero se está volviendo difícil justificar tanta memoria).

¿Hay alguna forma de reducir la cantidad de memoria que usa cada proceso hijo? (O alternativamente, ¿hacer un proceso de un solo hijo tan rápido que pueda establecer el máximo de hijos en algo como 2?). Estoy dispuesto a considerar cualquier opción, incluidas las que pueden resultar en una precisión reducida.

Ya leí la página "Problemas de memoria insuficiente" en la SA wiki ; no hay nada de utilidad. Los mensajes de más de 5 MB no se escanean con SA.

15
Tony Meyer

Creo que está malinterpretando la forma en que Linux informa el uso de la memoria. Cuando un proceso se bifurca, da como resultado un segundo proceso que comparte muchos recursos con el proceso original. Incluido en eso está la memoria. Sin embargo, Linux utiliza una técnica conocida como Copia en escritura (COW) para esto. Lo que eso significa es que cada proceso hijo bifurcado verá los mismos datos en la memoria que el proceso original, pero siempre que esos datos cambien (por el hijo o el padre), los cambios se copian y solo entonces apuntan a una nueva ubicación.

Hasta que uno de los procesos realice cambios en esos datos, compartirán la misma copia. Como resultado, podría tener un proceso que use 100 MB de RAM y bifurcarlo 10 veces. Cada uno de esos procesos bifurcados mostraría que se están usando 100 MB de RAM, pero si observa el uso general de memoria en la caja, es posible que solo muestre que se están usando 130 MB de RAM (100 MB compartidos entre procesos, más algunos MB de sobrecarga, más otra docena o dos MB para el resto del sistema).

Como ejemplo final, tengo una caja en este momento con 30 procesos de Apache en ejecución. Cada proceso muestra un uso de 22 MB de RAM. Sin embargo, cuando ejecuto free -m para mostrar mi uso general de RAM, obtengo:

[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 puede ver, esta caja ni siquiera tiene suficiente RAM para ejecutar 30 procesos que usaban cada uno 18 MB de RAM "real". A menos que literalmente se esté quedando sin RAM o sus aplicaciones estén cambiando mucho, no me preocuparía por las cosas.

ACTUALIZACIÓN: Además, consulte esta herramienta llamada smem , mencionada por jldugger en la respuesta a otra pregunta sobre el uso de la memoria de Linux aquí .

5

Usando sa-compile es posible que pueda mejorar la velocidad de coincidencia de muchas reglas.

1
David Schmitt

Esto es lo que hice.

Tengo una configuración en la que muchos mensajes tienden a entregarse aproximadamente al mismo tiempo; para una serie de experimentos, ejecuto SA en mensajes que se copian en un spool temporal y luego se entregan mediante un trabajo cron cada cinco minutos.

spamd seguiría imprimiendo "tal vez debería aumentar el parámetro max-children" y lo elevé a 40 en un momento, pero el servidor consumía todo su espacio de intercambio y fallaba.

Ahora he implementado un régimen diferente en el que la entrega se rige por un archivo de bloqueo de Procmail. Debido a que fue simple de hacer, solo uso el último dígito del ID del proceso y ejecuto con 10 hijos. No estoy del todo seguro de que esto sea óptimo, pero ya me ha ayudado a evitar los locos picos de carga que experimentaba de vez en cuando.

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

Además, comienzo spamd con una serie de ulimit restricciones. Los números fueron sacados de http://svn.Apache.org/repos/asf/spamassassin/trunk/contrib/run-masses excepto que eliminé el ulimit -u restricción. (No estoy seguro de lo que está sucediendo. 32 es demasiado pequeño en cualquier caso. Con algo como 500 podría mantener spamd ejecutándose por un tiempo, pero eventualmente llegando al límite).

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

Supongo que terminaré con fallas en la entrega si la carga es demasiado alta durante un tiempo prolongado, pero hasta ahora, parece que he logrado reducir la carga a niveles manejables con esto; y un montón de entregas fallidas sigue siendo mucho mejor que la máquina que se queda sin intercambio.

1
tripleee

Los promedios de carga altos son (a veces) un síntoma indirecto de que su máquina se está quedando sin RAM (y utiliza muchos procesos de intercambio de CPU desde la memoria virtual), por lo que podría intentar configurar su correo servidor para no pasar correo a través de SpamAssassin si los promedios de carga son demasiado altos.

No menciona qué MTA está ejecutando, pero si está llamando a SA desde una lista de control de acceso en exim4, entonces la sugerencia al final de este mensaje es efectivo.

Además, puede aliviar la carga en SA y, por lo tanto, reducir su uso de memoria, colocando otros métodos de filtrado de spam menos intensivos en recursos frente a él (es decir, para que procesen y rechacen algo de spam antes de que llegue a SA). por ejemplo, las listas grises y las llamadas de verificación del remitente utilizan relativamente poca RAM.

0
David North

Estuvimos en una situación similar hace varios meses. SpamAssassin y ClamAV usaban mucha memoria en un servidor alojado. Tuvimos la opción de agregar más memoria al servidor, pero resultó ser más rentable y rentable cambiar a Postini. YMMV.

0
Gerald Combs