如何减少 ClamAV 内存使用量?

Nie*_* R. 32 linux ubuntu memory

我在 512MB VPS 上运行基于 Ubuntu 的 Web 服务器(Apache、MySQL)。这对于它正在运行的网站(小型论坛)来说已经足够了。

因为我想添加一些病毒防护,所以我安装了 ClamAV 并使用它来扫描上传的文件,作为上传处理脚本 (PHP) 的一部分。

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

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

vk5*_*5tu 25

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

问题是大量的病毒签名。这导致算法的数据结构变得非常大。

您不能将这些数据结构发送到交换,因为算法数据结构的任何部分都没有比其他部分访问频率低的部分。如果您确实强制它们的页面交换磁盘,那么它们将在稍后被引用并直接交换回来。(从技术上讲,“数据结构的随机访问强制整个数据结构位于进程的工作内存集中”。)

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

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

这是在运行 Debian Wheezy 的 32 位机器上使用的内存,它是 clamd。

# ps_mem.py 
 Private  +   Shared  =  RAM used   Program
281.7 MiB + 422.5 KiB = 282.1 MiB   clamd
Run Code Online (Sandbox Code Playgroud)

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

  • 无论如何,接受 100% 的 AV 效率都是一个谬论(例如未知的信号),我们也应该接受 <100% 的扫描率,从而实现除裸机节俭之外的其他策略。多参数启发式筛选阶段(可能很快会使用预先训练的神经网络)可以预先过滤并转移可疑项目,以便在低优先级流程中进行严格检查。对于电子邮件,破坏线性的并行队列不是问题,延迟可疑邮件以有利于简化主流是可取的,并且偶尔的漏报就像我们所有人的生活方式一样。 (2认同)