当我们向本地 Postfix 服务器提交单个电子邮件时,我们看到一些(可能?)奇怪的延迟。
为了帮助诊断问题,我编写了一个小测试程序,发送了 5 封电子邮件:
get smtp 1ms ( 1 ms)
email 0 677ms (676 ms)
email 1 802ms (125 ms)
email 2 890ms ( 88 ms)
email 3 973ms ( 83 ms)
email 4 1088ms (115 ms)
除去第一封电子邮件中的握手,每封电子邮件大约需要 90 毫秒。这些时间也得到了其他人使用不同代码路径编写的另一个测试应用程序的证实,因此它似乎与服务器有关。
我打开了详细日志记录,可以看到延迟位于消息结束\r\n\r\n
和接收之间:
[16:31:29.95] [SEND] \r\n.\r\n
[16:31:30.05] [RECV] 250 2.0.0 Ok: queued as B128E1E063\r\n
[16:31:30.08] [SEND] \r\n.\r\n
[16:31:30.17] [RECV] 250 2.0.0 Ok: queued as 4A7DE1E06E\r\n
[16:31:30.19] [SEND] \r\n.\r\n
[16:31:30.27] [RECV] 250 2.0.0 Ok: queued as 68ACC1E072\r\n
[16:31:30.28] [SEND] \r\n.\r\n
[16:31:30.34] [RECV] 250 2.0.0 Ok: queued as 7EFFE1E079\r\n
[16:31:30.39] [SEND] \r\n.\r\n
[16:31:30.45] [RECV] 250 2.0.0 Ok: queued as 9793C1E07A\r\n
时间间隔说明了一切(不考虑初始电子邮件所需的握手)——每封电子邮件都要等待大约 60-90 毫秒才能让 Postfix 排队!
在我看来,这似乎有点过分了。Postfix 发送每封电子邮件需要 60-90 毫秒,这是“正常”的吗?还是我的期望太高了?我预计本地 Postfix 服务器会在大约 20 毫秒内将电子邮件排队,最高额!
答案1
这听起来很正常。如果您同时运行多个连接提交邮件,每封邮件还能用 90 毫秒吗?这将让您轻松提高提交邮件的速度。
我知道其他 MTA(sendmail)将使用 fsync() 来确保在发回 250 响应之前将已接受的邮件提交到磁盘,这样如果系统在接受邮件后崩溃,电子邮件就不会被丢弃。postfix 可能也这样做。
您可以通过将邮件假脱机目录临时放到 tmpfs 上并查看接受邮件需要多长时间来测试这一点。
其他的事情可以在 90 毫秒窗口内要执行的操作包括:病毒扫描、黑名单检查等。但如果它们已配置,您可能就会知道。
答案2
Postfix 最佳实践表明您应该在初始队列之前进行大部分过滤以避免:
- 浪费资源去接收本来就不应该接受的消息;
- 避免发回错误消息(因此浪费原始电子邮件和错误消息的资源);
- 避免向错误的收件人发送错误消息。
因此,排队时间并未优化以节省资源。如果您禁用所有检查smtpd_recipient_restrictions
在 postfix 中,main.cf
您可能可以以更多错误和向用户发送更多(错误)错误消息为代价来获得更快的排队速度。例如,如果它只是应用程序的出口服务器,那么这将是完全可以接受的。