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(MADV_WILLNEED,...)的进程没有任何影响。