如何最大限度地减lessSpamAssassin(垃圾邮件)内存的使用

我在Debian上使用了SpamAssassin(Pyzor,AWL和Bayes被禁用,并启用sa-compile的默认configuration),并且每个spamdsubprocess在32位上消耗大约100到150MB的内存(大约50MB的实内存)在64位服务器上大约是双倍(逻辑上足够)。 通常有两个subprocess,但在繁忙时间可能有五个(最大)运行。

200到600MB的ISTM是这个任务的很多内存。 我想继续使用SA作为我的过滤结构的一部分,但要certificate这么多的内存正变得困难。

有没有办法减less每个subprocess使用的内存量? (或者,也可以让一个单独的subprocess如此之快,以至于我可以将最大的subprocess设置为2)。 我愿意考虑任何选项,包括将会或可能导致准确度降低的选项。

我已经阅读了SA wiki上的“Out of Memory Problems”页面 。 没有什么用处。 大于5 MB的消息不会使用SA进行扫描。

我认为你误解了Linux报告内存使用的方式。 当一个进程分叉时,会导致第二个进程与原进程共享大量的资源。 包括在内存中。 但是,Linux使用了一种称为写入时拷贝(Copy On Write,COW)的技术。 这意味着每个分叉的subprocess将在内存中看到与原始进程相同的数据,但每当数据发生更改(由subprocess或父进程)时,所做的更改都将被复制,然后仅指向新的进程。

在其中一个进程对这些数据进行更改之前,他们共享相同的副本。 因此,我可以有一个使用100MB内存的进程,并分叉10次。 这些分叉的进程中的每一个都会显示100MB的RAM,但是如果您查看了盒子上的总体内存使用情况,则可能只会显示正在使用130MB的RAM(进程之间共享100MB,加上几MB的开销,另加十二MB或两个系统的其余部分)。

作为最后一个例子,我现在有一个盒子,有30个Apache进程正在运行。 每个进程显示使用22MB的RAM。 但是,当我运行免费-m显示我的整体RAM使用情况时,我得到:

topher@crucible:/tmp$ free -m total used free shared buffers cached Mem: 349 310 39 0 24 73 -/+ buffers/cache: 212 136 Swap: 511 51 460 

正如你所看到的,这个盒子甚至没有足够的RAM来运行30个进程,每个进程使用18MB的“真实”RAM。 除非你真的用完了内存,否则你的应用程序会大量交换,我不会担心。

更新:另外,检查出这个工具称为smem ,由jldugger在Linux内存使用的另一个问题的答案在这里提到。

使用sa-compile你可能能够提高许多规则的匹配速度。

这是我所做的。

我有一个设置,大量的消息倾向于在同一时间大致提供; 对于一系列的实验,我在复制到一个临时线程的消息上运行SA,然后每隔五分钟由一个cron作业交付。

spamd会继续打印“也许你应该增加max-children参数”,并且我一度将它提高到了40,但是我让服务器消耗掉了所有的交换空间和崩溃。

现在我已经实现了一个不同的制度,交付由Procmaillocking文件pipe理。 因为做起来很简单,所以我只是使用进程ID的最后一个数字,然后运行10个孩子。 我一点也不确定这是最佳的,但它已经帮助避免了我时常受到的疯狂的负载峰值。

 LINEBUF=10240 # Grab last digit of PID for lockfile PID=$$ :0 * PID ?? ()\/[0-9]$ { D=$MATCH } :0 * > 512000 { SA="(too large)" } :0Ew:/tmp/20spamc.$D SA=| spamc -p 38783 -l -y 

另外,我用一些ulimit限制启动spamd 。 数字从http://svn.apache.org/repos/asf/spamassassin/trunk/contrib/run-masses取出,除了我删除了ulimit -u限制。 (不知道发生了什么,32在任何情况下都太小了,像500这样的东西,我可以让spamd运行一段时间,但最终会跑到极限。)

 ulimit -v 204800 ulimit -m 204800 ulimit -n 256 #ulimit -u 32 perl -T -I lib -w spamd --min-children 2 --max-children 10 --max-spare 5 etc etc 

如果负荷太长,我想最终会出现交货失败,但到目前为止,似乎我已经设法将负荷减less到可pipe理的水平; 而一堆失败的交付仍然比交换机用完了。

高负载平均值(有时)是一个间接的症状,表示您的机器内存不足(并且使用大量来自虚拟内存的CPU交换进程),所以您可以尝试configuration邮件服务器,以防止邮件通过SpamAssassin传递加载平均值太高。

你没有提到你正在运行的MTA,但是如果你从exim4的访问控制列表中调用SA,那么这个消息底部的build议是有效的。

此外,通过在其之前放置一些其他较less资源密集型的垃圾邮件过滤方法(即在垃圾邮件到达SA之前处理并拒绝一些垃圾邮件),您可以减轻SA上的负载,从而减less其内存使用量。例如,灰名单和发件人validation标注使用相对较less的RAM。

几个月前,我们也遇到了类似的情况。 SpamAssassin和ClamAV在托pipe服务器上使用大量内存。 我们可以select向服务器添加更多的内存,但是切换到Postini的成本和时间效率更高。 因人而异。