Come ridurre l'utilizzo della memoria ClamAV?


26

Sto eseguendo un server Web basato su Ubuntu (Apache, MySQL) su un VPS da 512 MB. Questo è più che sufficiente per il sito Web in esecuzione (piccolo forum).

Come volevo aggiungere un po 'di protezione contro i virus, ho installato ClamAV e lo uso per scansionare i file caricati come parte dello script di gestione del caricamento (PHP).

Sto eseguendo il servizio clamav-daemon, quindi le definizioni non devono essere caricate ogni volta che un file viene scansionato. Un aspetto negativo di questa pratica sembra essere la "enorme" quantità di memoria utilizzata dal servizio clamav-demone:> 200 MB. Ciò ha già comportato l'arresto forzato del servizio e il rifiuto dei caricamenti.

Posso semplicemente aggiornare la memoria del VPS a 1024 MB, ma voglio sapere se esiste un modo per ridurre l'utilizzo della memoria di ClamAV, ad esempio non caricando definizioni indesiderate.

Risposte:


15

ClamAV contiene le stringhe di ricerca usando gli algoritmi di stringa classica (Boyer Moore) e di espressione regolare (Aho Corasick). Essendo algoritmi degli anni '70, sono estremamente efficienti in termini di memoria.

Il problema è l'enorme numero di firme dei virus. Questo porta alla crescita delle strutture di dati degli algoritmi piuttosto grandi.

Non è possibile inviare tali strutture dati per lo scambio, poiché non vi sono parti delle strutture dati degli algoritmi a cui si accede meno spesso rispetto ad altre parti. Se costringi le loro pagine a scambiare il disco, verranno referenziate qualche istante dopo e cambieranno immediatamente. ".)

Le strutture dati sono necessarie se si esegue la scansione dalla riga di comando o la scansione da un demone.

Non è possibile utilizzare solo una parte delle firme dei virus, in quanto non si è in grado di scegliere quali virus verranno inviati e quindi non si può dire quali firme saranno necessarie.

Ecco la memoria utilizzata su un computer a 32 bit che esegue Debian Wheezy ed è clamd.

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

Modifica: vedo qualcuno suggerire di impostare la dimensione del set residente. Se ciò ha esito positivo, la dimensione del set residente inferiore alla dimensione del set di lavoro comporterà il thrashing del processo da e verso lo swap. Ciò ridurrà sostanzialmente le prestazioni dell'intero sistema. In ogni caso la pagina del manuale di Linux per setrlimit (RLIMIT_RSS, ...) afferma che l'impostazione della dimensione del set residente non è più supportata e non ha mai avuto alcun effetto sui processi che hanno scelto di non chiamare madvise (MADV_WILLNEED, ...).


1

Ho riscontrato un problema simile eseguendo clamd su una piccola scatola NAS domestica con solo 512 MB. Da un sondaggio di domande in rete sembra che non ci sia modo di ridurre l'utilizzo della memoria. Il database di cose brutte diventa sempre più grande.

È possibile configurare clamav per l'esecuzione in modalità non daemon installando "clamav" anziché "clamav-daemon". Ciò può consentire di avere più memoria per la maggior parte del tempo. Quando esegui la scansione dei caricamenti, sarà sempre necessaria una grande quantità di RAM.


1
Il principale svantaggio di questo approccio è che ci vorrà più tempo per eseguire la scansione. Ogni volta che viene caricato un file, è necessario caricare il database prima di poter eseguire la scansione. Il caricamento del db richiede molti minuti preziosi se si desidera avere una risposta rapida per l'utente. Inoltre, quando vengono elaborati più caricamenti contemporaneamente, avrai più thread che caricano il database con conseguente utilizzo della RAM ancora maggiore. Da qui l'utilizzo del demone. La mia soluzione era aggiornare il mio servizio VPS e pagare un extra di 5 USD / mese per la RAM aggiuntiva. Posso vivere con questo aumento dei costi :)
Niels R.

1

Questa risposta non è verificata e potrebbe non funzionare. Inoltre non risponde come ridurre l'utilizzo della memoria, ma come limitare l'utilizzo della memoria, che è un po 'diverso.


È possibile modificare lo script di inizializzazione ClamAV (int /etc/init.d/per aggiungere il comando ulimit -m amountofram.
Limita la possibilità di ClamAV e probabilmente si cambierà, che probabilmente rallenterà l'intero sistema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.