当队列已经很大时,我发现 Postfix 接受邮件存在性能问题,有什么建议吗?

当队列已经很大时,我发现 Postfix 接受邮件存在性能问题,有什么建议吗?

我使用 postfix 来为我编写的邮件系统进行最终投递。因此,此 postfix 安装仅接受来自我的邮件,并会反弹。当 postfix 队列为空时,它可以在 5ms 左右接受一封邮件。当队列中有 150k-200k 条消息左右时,从我到 postfix 的交接速度非常慢,大约需要 50-100 毫秒,有时甚至 500ms。

我对 SMTP 对话的每一部分都记录了时间,因此我可以看到时间都花在了哪里。有些时间是在我等待 RCPT TO 命令的响应时,但大多数时间是在我发送最后一个点之后、在我收到“250 个 OK 已排队为...”响应之前消失的。

我在想 RCPT TO 延迟可能是在 DNS 查找中,但这对我的排队时间没有帮助。我为所有要发送的电子邮件保持一个 TCP 套接字打开,并且我为每封邮件 RSET 对话,因此不会浪费时间建立和断开 TCP 连接,一切都在等待 postfix 将消息排队。

我读过的关于 Postfix 性能调优的所有内容都与队列管理以及为各个域发送邮件有关。但我关心的是让 Postfix 首先快速接受邮件。

有什么方法可以找出 postfix 在这段时间内做了什么,或者有什么方法可以让它运行得更快?/var/spool/postfix 队列位于本地磁盘上,因此我无法让它运行得更快。

有什么建议么?

答案1

设置以下内容main.cf

hash_queue_depth = 3
hash_queue_names = deferred, defer, incoming, active

这会在传入队列和活动队列中生成子目录,这样平面目录就不会一次包含所有邮件。现在它们被放入子目录中。

但请注意:有 15 万到 20 万封邮件等待发送,这表明对邮件发送平衡的理解存在严重错误。在我看来,这像是垃圾邮件……

答案2

解决方案之一是拥有一个辅助邮件服务器来处理所有等待投递的退回邮件,这是确保真实电子邮件顺利通过的最佳解决方案。

答案3

这是一个很老的问题,但技术并没有发生太大变化/现有的答案没有太大帮助。

当队列中有 15 万到 20 万条消息时,从我到 Postfix 的切换速度真的很慢

从这个问题的提出方式来看,原帖作者似乎指的是积极的队列在这里(Postfix 有多个队列)。Postfix 正在做它应该做的事情来防止自己阻塞。活动队列是所有与交付调度有关的巧妙东西所在。当它变得太大时,调度就成为瓶颈。

当您看到与负载相关的性能问题时,最好检查负载、CPU 和 IO 指标以查看是否存在硬件瓶颈。

如果您正在运行仅发送中继,则减少这里的 in_flow_delay 将减少客户端的限制。但您需要保持活动队列的大小较低。限制消息从传入队列传递到活动队列的速率可以有所帮助。但最好的解决方案是更快地从活动队列中取出内容。您在这里可以做的最好的事情是良好的声誉管理、快速 DNS,以及(如果可能)将发送分发到多个 IP 地址。降低重试频率也将有助于降低活动队列的填充率,并帮助提供商根据连接尝试的频率限制接受。

SPF、DMARC 和 DKIM(正确配置)应被视为必不可少。

因为每个人都发明了自己的处理垃圾邮件的机制,所以总会有异常值 - 为此您需要设置自定义传输。

相关内容