利用Postal对postfix邮件系统进行压力测试

本笔记只记录配置freebsd系统下利用postal对postfix进行压力测试的测试,本笔记虽然是在FreeBSD系统上测试通过,其中多数内容也适合各个Linux发行版本以及各个BSD分支,在其他系统上只需要做少量调整。

1、安装postal,当前版本是0.66;
[[email protected] ~]# cd /usr/ports/benchmarks/postal
[[email protected] ~]# make install clean

2、命令:
[[email protected] ~]# postal -m 20k -p 20 -l 192.168.27.228 -r 40 -c 200 192.168.27.228 aa dd

3、邮件系统微调:

将postfix的默认进程限制提升到500,即:default_process_limit = 500,这样可以加大了并发速度。
将maillog等需要频繁进行write/sync的日志设置为async write(即对syslogd采用了异步写优化,在设置的目录前加-号) 也能大幅度提高速度。
mail.* -/var/log/maillog
使用chattr命令调整/var/spool/postfix目录的属性为async
注意,当SMTP注入性能大幅度下降时,可检查/var/spool/postfix目录,会发现qmgr已达到处理上限了,该上限是由qmgr_message_active_limit参数设置。故此incoming开始增长很多,Postfix开始放慢处理速度。
以上所有测试都是在default_destination_concurrency_limit = 10的条件下完成的,所以在virtual进行本地mailbox投递时,并发数很少,而active目录增长得很快,没有足够多的virtual进行投递,结果是无法快速地将邮件写到硬盘。
修改default_destination_concurrency_limit参数值为1000
default_destination_concurrency_limit = 1000
此时出现另外一个问题:active队列大概只维持在200-300百封信的样子,但defer/defered目录开始有所增长,并且SMTP注入速度下降,大概只有1850封信/分钟的速度。此时virtual的并发数目达到了400个!
可以推断,这是因为virtual投递速度和数量大幅度增加,致使磁盘写(write)操作过于频繁,使磁盘I/O性能吃紧,导致性能下降。
解决办法:使用分布式存储,利用mailswitch这一类技术,将最终的邮件投递由存储机器上的软件完成。
将这个default_destination_concurrency_limit改成100,速度提升了一些,出现了很多Temporary lookup failure错误信息

4、最后结论:
在硬件足够好的前提下,系统的瓶颈一般在磁盘的I/O上。而如何调整Postfix的注入并发数、系统总进程数、投递的并发数等,需要大量的测试,找到在具体平台、具体硬件下所能达到的最高效能,继而定出合理的数值。作为一个繁忙的邮件系统,磁盘的I/O能力,尤其是队列所在的磁盘I/O能力要求非常高。在不增加硬件投入的前提下,善于利用iostat, vmstat及相关I/O分析工具,可以找到磁盘的限制在哪里,利用elvtune调整磁盘的读/写时延(delay)来减少这种限制所带来的性能劣化。如果有足够的经济实力,可以使用带NVRAM的磁盘系统,使用Ultra 320的磁盘,甚至组成RAID0+1的系统来构成队列。这样可有效的提高速度。
有报道称,国外有公司使用Sun的存储设备,在Solaris下实现了sendmail 287封邮件/秒 的处理速度。换言之相当于17220封/分的速度。这得益于它们使用了Sun的高级存储设备,配备了NVRAM的Cache,非常高速的硬盘,相当好的性能调整和优化。通过这个国外的实例可以说明一点,Sendmail其实性能也可以相当好,关键是看系统的设计和部署人员的能力和经验。而本文所实现的结果,也反映了Postfix在低端硬件下效能相当不俗。如果按正常的4000封/分钟的处理速度,那么一天相当于处理576万封普通大小的电子邮件。