提高 Postfix 出站邮件的性能

提高 Postfix 出站邮件的性能

我们正在尝试优化 Dell PowerEdge 1850、双 3GHz 处理器、3072MB RAM,运行 Postfix 2.8.4 并使用 OpenDKIM 2.4.1 签署邮件。

iostat -x 输出为:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.59    0.04    0.20    0.24    0.00   98.94

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    11.57  0.01  4.97     0.27   132.35    26.63     0.03    6.09   2.03   1.01
sda1              0.00     0.00  0.00  0.00     0.00     0.00    13.40     0.00   16.26  15.73   0.00
sda2              0.00    11.57  0.01  4.97     0.27   132.35    26.63     0.03    6.09   2.03   1.01
dm-0              0.00     0.00  0.01 16.54     0.27   132.35     8.01     0.11    6.55   0.61   1.01
dm-1              0.00     0.00  0.00  0.00     0.00     0.00     8.00     0.00    3.42   0.44   0.00

顶部输出:

top - 22:10:04 up 86 days,  1:46,  5 users,  load average: 2.99, 2.94, 2.82
Tasks: 227 total,   8 running, 218 sleeping,   0 stopped,   1 zombie
Cpu(s): 66.1%us,  1.3%sy,  0.0%ni, 32.3%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   3115136k total,  2819188k used,   295948k free,   248620k buffers
Swap:  5177336k total,        0k used,  5177336k free,  1695580k cached

我们使用 SwiftMailer 通过 SMTP 向 Postfix 发送邮件。如果我们尝试启动 3 个以上通过 SwiftMailer 发送的 PHP 脚本的并行实例,平均负载将达到 3+,并且发送速度会大幅下降。我们几乎要花一整天的时间才能发送 50 万条消息。远程邮件服务器很乐意接受我们的邮件,任何延迟的邮件都会被传递给后备中继。

在发送过程中,我们的 qshape 显示队列快速清空:

                                     T  5 10 20 40 80 160 320 640 1280 1280+
                              TOTAL 10 10  0  0  0  0   0   0   0    0     0
                          gmail.com  2  2  0  0  0  0   0   0   0    0     0
                          yahoo.com  2  2  0  0  0  0   0   0   0    0     0
                            aol.com  1  1  0  0  0  0   0   0   0    0     0
                            aim.com  1  1  0  0  0  0   0   0   0    0     0
                           evhs.net  1  1  0  0  0  0   0   0   0    0     0
                         myactv.net  1  1  0  0  0  0   0   0   0    0     0
                        hotmail.com  1  1  0  0  0  0   0   0   0    0     0
                     googlemail.com  1  1  0  0  0  0   0   0   0    0     0

而且由于我们使用了后备中继,所以我们主 SMTP 服务器上的延迟队列是空的。

我们正在使用本地递归缓存名称服务器 (Unbound),并遵循了 Postfix Tuning README 中的所有调整提示。但我们仍然不知道在哪里寻找瓶颈,为什么发送 500K 消息需要一整天的时间。我读过其他 Postfix 优化文章(包括一篇关于 ServerFault 的文章),但罪魁祸首似乎总是 IO。但我们的 iostat 输出看起来磁盘一点也不忙。

我们还应该从哪里开始寻找?

答案1

无需签名和出站垃圾邮件扫描,Postfix 每小时可轻松处理 360,000 封邮件。

这里的问题是 66.1%us 的 CPU 使用率。由于您没有提供有关消耗此负载的进程的信息,因此我认为它们与 Postfix 无关。它们要么是 DKIM 签名进程,要么是 PHP 进程。

您需要调整负责负载的进程,而不是负责邮件传递的进程。

答案2

“如果我们尝试启动 3 个以上通过 SwiftMailer 发送的 PHP 脚本的并行实例,平均负载将达到 3+,并且传输速度会大幅下降。”

您可能需要仔细查看脚本的内存和/或 CPU 处理要求/负载。

答案3

您使用的是软件 raid 吗?不久前我遇到了一个问题,raid(raid 5)有问题。要么使用 raid 10,要么根本不使用 raid。

对于 postfix,请尝试查看 default_process_limit。也许可以使用 50 这个值。此外,在本地安装一个缓存名称服务器(例如 dnsmasq),可以帮助处理 DNS。

高血压

相关内容