如何减少ClamAV的内存使用量?


26

我正在512MB VPS上运行基于Ubuntu的Web服务器(Apache,MySQL)。这对于它正在运行的网站(小型论坛)绰绰有余。

当我想对病毒进行一些防护时,我安装了ClamAV并将其作为上载处理脚本(PHP)的一部分扫描上载的文件。

我正在运行clamav-daemon服务,因此不必在每次扫描文件时都加载定义。这种做法的一个缺点似乎是clamav-daemon服务使用的“巨大”内存量:> 200 MB。这已经导致该服务被迫停止并且上传被拒绝。

我可以简单地将VPS的内存升级到1024MB,但是我想知道是否存在一种方法,例如通过不加载不需要的定义来减少ClamAV的内存使用。

Answers:


15

ClamAV使用经典字符串(Boyer Moore)和正则表达式(Aho Corasick)算法保存搜索字符串。作为1970年代的算法,它们具有极高的存储效率。

问题在于大量的病毒签名。这导致算法的数据结构变得相当大。

您无法发送这些数据结构进行交换,因为算法的数据结构的任何部分都没有其他部分那么频繁地访问。如果您确实要强迫它们的页面交换磁盘,那么稍后会引用它们,然后直接将它们交换回来。(从技术上讲,我们说“对数据结构的随机访问会迫使整个数据结构位于进程的内存工作集中。 “。)

如果从命令行扫描或从守护程序扫描,则需要数据结构。

您不能仅使用病毒签名的一部分,因为您无法选择要发送的病毒,因此也无法确定将需要哪些签名。

这是在运行Debian Wheezy的32位计算机上使用的内存,并且已满载。

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

编辑:我看到有人建议设置居民集大小。如果此操作成功,那么驻留集大小小于工作集大小将导致进程往返于交换中。这将大大降低整个系统的性能。在任何情况下,Linux手册页的setrlimit(RLIMIT_RSS,...)都说不再支持设置常驻集大小,并且对选择不调用madvise(MAD​​V_WILLNEED,...)的进程没有任何影响。


1

我遇到了一个类似的问题,该问题在只有512MB的小型家用NAS机上运行时满载。从网上的问题调查来看,似乎没有任何方法可以减少内存使用量。令人讨厌的事物的数据库正变得越来越大。

通过安装“ clamav”而不是“ clamav-daemon”,可以将clamav配置为在非守护程序模式下运行。这可能使您大部分时间拥有更多的内存。当您扫描上传文件时,总是需要大量的RAM。


1
这种方法的主要缺点是扫描将花费更多时间。每次上传文件时,都需要先加载数据库,然后才能进行扫描。如果您想对用户做出快速响应,则数据库的加载会花费大量宝贵的时间。此外,当同时处理多个上载时,您将有多个线程加载数据库,从而导致更大的RAM使用率。因此,守护程序的用法。我的解决方案是升级我的VPS服务,并每月为额外的RAM支付5美元的额外费用。我可以忍受这种成本增加:)
Niels R.

1

该答案未经验证,可能无法正常工作。它还没有回答如何减少内存使用量,而是如何限制内存使用量,这有点不同。


您可以编辑ClamAV初始化脚本(int /etc/init.d/添加命令ulimit -m amountofram
它将限制ClamAV的可能性,并且您可能会交换,这可能会减慢整个系统的速度。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.