Wie kann man die ClamAV-Speichernutzung reduzieren?

26

Ich verwende einen Ubuntu-basierten Webserver (Apache, MySQL) mit einer VPS von 512 MB. Dies ist mehr als ausreichend für die Website, die ausgeführt wird (kleines Forum).

Um etwas Schutz vor Viren zu bieten, habe ich ClamAV installiert und es verwendet, um hochgeladene Dateien als Teil des Upload-Handling-Skripts (PHP) zu scannen.

Ich verwende den Dienst clamav-daemon, damit die Definitionen nicht jedes Mal geladen werden müssen, wenn eine Datei gescannt wird. Ein Nachteil dieser Vorgehensweise scheint die "enorme" Speicherkapazität zu sein, die vom clamav-daemon-Dienst verwendet wird:> 200 MB. Dies hatte bereits zur Folge, dass der Dienst angehalten werden musste und die Uploads abgelehnt wurden.

Ich kann den Speicher des VPS einfach auf 1024 MB aufrüsten, aber ich möchte wissen, ob es eine Möglichkeit gibt, die Speichernutzung von ClamAV zu verringern, indem z. B. keine unerwünschten Definitionen geladen werden.

Niels R.
quelle

Antworten:

15

ClamAV speichert die Suchzeichenfolgen mit den klassischen Algorithmen für Zeichenfolgen (Boyer Moore) und reguläre Ausdrücke (Aho Corasick). Als Algorithmen aus den 1970er Jahren sind sie äußerst speichereffizient.

Das Problem ist die große Anzahl von Virensignaturen. Dies führt dazu, dass die Datenstrukturen der Algorithmen ziemlich groß werden.

Sie können diese Datenstrukturen nicht an Swap senden, da auf keine Teile der Datenstrukturen des Algorithmus weniger häufig zugegriffen wird als auf andere Teile. Wenn Sie die Auslagerung von Seiten erzwingen, werden diese nur einen Moment später referenziert und direkt wieder eingelagert. (Technisch gesehen bedeutet dies "der zufällige Zugriff auf die Datenstruktur zwingt die gesamte Datenstruktur, sich im Arbeitsspeicher des Prozesses zu befinden ".)

Die Datenstrukturen werden benötigt, wenn Sie über die Befehlszeile oder von einem Daemon aus scannen.

Sie können nicht nur einen Teil der Virensignaturen verwenden, da Sie nicht auswählen können, welche Viren Sie senden möchten, und daher nicht ermitteln können, welche Signaturen Sie benötigen.

Hier ist der Speicher, der auf einer 32-Bit-Maschine mit Debian Wheezy und Clamd verwendet wird.

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

Bearbeiten: Ich sehe, dass jemand vorschlägt, die Größe des residenten Sets festzulegen. Wenn dies erfolgreich ist, führt eine residente Set-Größe, die kleiner als die Arbeits-Set-Größe ist, dazu, dass der Prozess zum und vom Swap gedrängt wird. Dadurch wird die Leistung des gesamten Systems erheblich verringert. Die Linux-Handbuchseite für setrlimit (RLIMIT_RSS, ...) besagt auf jeden Fall, dass das Festlegen der residenten Satzgröße nicht mehr unterstützt wird und keine Auswirkungen auf Prozesse hatte, die madvise nicht aufrufen (MADV_WILLNEED, ...).

vk5tu
quelle
1

Ich habe ein ähnliches Problem beim Ausführen von Clamd auf einer kleinen Heim-NAS-Box mit nur 512 MB. Aus einer Umfrage zu Fragen im Internet geht hervor, dass es keine Möglichkeit gibt, die Speichernutzung zu reduzieren. Die Datenbank der bösen Dinge wird immer größer.

Sie können clamav so konfigurieren, dass es im Nicht-Daemon-Modus ausgeführt wird, indem Sie "clamav" anstelle von "clamav-daemon" installieren. Dies kann dazu führen, dass Sie die meiste Zeit über mehr Speicher verfügen. Beim Scannen von Uploads wird immer ein großer Teil des Arbeitsspeichers benötigt.

Davefiddes
quelle
1
Der Hauptnachteil dieses Ansatzes ist, dass der Scan mehr Zeit in Anspruch nimmt. Jedes Mal, wenn eine Datei hochgeladen wird, muss die Datenbank geladen werden, bevor der Scan durchgeführt werden kann. Das Laden der Datenbank dauert viele wertvolle Minuten, wenn Sie dem Benutzer eine schnelle Antwort geben möchten. Wenn mehrere Uploads gleichzeitig verarbeitet werden, wird die Datenbank von mehreren Threads geladen, was zu einer noch höheren RAM-Auslastung führt. Daher die Verwendung des Daemons. Meine Lösung bestand darin, meinen VPS-Service zu aktualisieren und zusätzlich 5 USD / Monat für den zusätzlichen Arbeitsspeicher zu zahlen. Ich kann mit dieser Kostensteigerung leben :)
Niels R.
1

Diese Antwort wurde nicht überprüft und funktioniert möglicherweise nicht. Es gibt auch keine Antwort darauf, wie die Speichernutzung reduziert werden kann, sondern wie die Speichernutzung begrenzt werden kann, was ein bisschen anders ist.


Sie können das ClamAV-Init-Skript (int) bearbeiten /etc/init.d/, um den Befehl hinzuzufügen ulimit -m amountofram.
Dies schränkt die Möglichkeit von ClamAV ein und Sie werden wahrscheinlich tauschen, was wahrscheinlich Ihr gesamtes System verlangsamt.

Kiwy
quelle