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