一直以来 vps 上有两个内存怪兽,一个 mysql,一个 clamav,无奈之下把 mysql 放在一台美国的 2G 内存的 vps,把 clamav 放在一台欧洲的 1G 内存的 vps,顺便给欧洲的访问加加速,这样倒也一直相安无事。可是去年大概 10 月份的样子,在一次升级以后欧洲的服务器就一直 CPU 100%,不得已把 clamav 关闭了。直到最近才想着解决这个问题。
先想着限制 clamav 的内存和 CPU 使用,虽然能顺利跑起来,但是 clamav-milter 一直说
failed to initiate streaming/fdpassing
仔细检查日志,发现每当 milter 启动 clamav 的 daemon 时,就会发生 OOM,然后主程序就被杀了。
只好增大内存到 2G,不再限制 clamav 的内存使用,这次就可以顺利运行并扫描邮件了。
本来以为这样就解决了,可是晚上又收到服务器的报警邮件说 clamav-daemon 出错了被重启了,然后那边系统也发来 OOM 的警告。而且这还不是孤立事件,跑了几天发现每天定点定时的发生,只好又去查看日志。
原来每天到了时间就会更新病毒库,这时候 clamav 就开始吃内存,然后就被杀了。
Google 以后看到 clamav 的 blog,原来从 0.103.0 版开始引入了 Non-blocking database reloads,但问题是在更新病毒库的时候内存使用会加倍,还好有个开关,设置
ConcurrentDatabaseReload no
终于消停了,又可以愉快的扫描邮件有没有病毒了。代价是每个月的 vps 成本又上升了。