¿Cómo reducir el uso de memoria ClamAV?

26

Estoy ejecutando un servidor web basado en Ubuntu (Apache, MySQL) en un VPS de 512 MB. Esto es más que suficiente para el sitio web que está ejecutando (foro pequeño).

Como quería agregar algo de protección contra virus, instalé ClamAV y lo utilicé para escanear archivos cargados como parte del script de manejo de carga (PHP).

Estoy ejecutando el servicio clamav-daemon para que las definiciones no tengan que cargarse cada vez que se escanea un archivo. Una desventaja de esta práctica parece ser la "enorme" cantidad de memoria utilizada por el servicio clamav-daemon:> 200 MB. Esto ya provocó que el servicio se viera obligado a detenerse y que se rechazaran las cargas.

Simplemente puedo actualizar la memoria del VPS a 1024 MB, pero quiero saber si hay una manera de reducir el uso de memoria de ClamAV, por ejemplo, no cargando definiciones no deseadas.

Niels R.
fuente

Respuestas:

15

ClamAV mantiene las cadenas de búsqueda utilizando los algoritmos de cadena clásica (Boyer Moore) y de expresión regular (Aho Corasick). Siendo algoritmos de la década de 1970, son extremadamente eficientes en memoria.

El problema es la gran cantidad de firmas de virus. Esto lleva a que las estructuras de datos de los algoritmos crezcan bastante.

No puede enviar esas estructuras de datos para intercambiar, ya que no hay partes de las estructuras de datos de los algoritmos a las que se acceda con menos frecuencia que otras partes. Si obliga a las páginas a intercambiar discos, se hará referencia a ellos momentos más tarde y simplemente volverá a cambiar directamente. ".)

Las estructuras de datos son necesarias si está escaneando desde la línea de comando o escaneando desde un demonio.

No puede usar solo una parte de las firmas de virus, ya que no puede elegir qué virus se le enviarán y, por lo tanto, no puede saber qué firmas necesitará.

Aquí está la memoria utilizada en una máquina de 32 bits que ejecuta Debian Wheezy y es clamd.

# ps_mem.py 
 Private  +   Shared  =  RAM used   Program
281.7 MiB + 422.5 KiB = 282.1 MiB   clamd

Editar: veo que alguien sugiere configurar el tamaño del conjunto residente. Si esto tiene éxito, tener un tamaño de conjunto residente menor que el tamaño del conjunto de trabajo conducirá al proceso de intercambio hacia y desde el intercambio. Esto reducirá sustancialmente el rendimiento del sistema completo. En cualquier caso, la página de manual de Linux para setrlimit (RLIMIT_RSS, ...) dice que la configuración del tamaño del conjunto residente ya no es compatible y nunca tuvo ningún efecto en los procesos que optaron por no llamar a madvise (MADV_WILLNEED, ...).

vk5tu
fuente
1

Me encontré con un problema similar al ejecutar clamd en una pequeña caja NAS doméstica con solo 512 MB. De una encuesta de preguntas a través de la red parece que no hay forma de reducir el uso de memoria. La base de datos de cosas desagradables se hace cada vez más grande.

Es posible configurar clamav para que se ejecute en modo no demonio instalando "clamav" en lugar de "clamav-daemon". Esto puede permitirle tener más memoria la mayor parte del tiempo. Cuando escanea cargas, siempre necesitará una gran cantidad de RAM.

davefiddes
fuente
1
El principal inconveniente de este enfoque es que tomará más tiempo hacer el escaneo. Cada vez que se carga un archivo, la base de datos debe cargarse antes de poder realizar el análisis. La carga de la base de datos toma muchos minutos valiosos si desea tener una respuesta rápida para el usuario. Además, cuando se procesan varias cargas al mismo tiempo, tendrá múltiples subprocesos cargando la base de datos, lo que resultará en un uso aún mayor de RAM. De ahí el uso del demonio. Mi solución fue actualizar mi servicio VPS y pagar 5 USD / mes adicionales por la RAM adicional. Puedo vivir con este aumento de costos :)
Niels R.
1

Esta respuesta no está verificada y podría no funcionar. Tampoco responde cómo reducir el uso de memoria, sino cómo limitar el uso de memoria, que es un poco diferente.


Puede editar el script de inicio ClamAV (int /etc/init.d/para agregar el comando ulimit -m amountofram.
Limitará la posibilidad de ClamAV y probablemente intercambiará, lo que probablemente ralentizará todo su sistema.

Kiwy
fuente