这就是我所做的。
我有一个设置,其中往往趋向于同时发送许多消息;为了进行一系列实验,我对复制到临时假脱机然后由cron作业每五分钟发送一次的邮件运行SA。
spamd
会继续打印“也许您应该增加max-children参数”,然后我将它一次提高到40,但是服务器消耗了所有交换空间并崩溃了。
现在,我实现了一种不同的机制,其中交付由Procmail锁定文件控制。因为这样做很简单,所以我只使用进程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
另外,我在开始时spamd
有很多ulimit
限制。这些数字是从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
我想如果负载过长的时间过长会导致交付失败,但是到目前为止,看来我已经设法将负载降低到可管理的水平。而且一堆失败的交付仍然比交换用完的机器好得多。