我有几台Sendmail服务器,它们通过SMTP将大量(成千上万)日志邮件转发到下游存档库。 所有这些电子邮件都有相同的收件人域(让我们称之为“fooarchiveproviderdomain.com”)。 就我而言,我在归档域的/etc/mail/mailertable设置了一个简单的路由:
fooarchiveproviderdomain.com esmtp:[1.1.1.1]:[2.2.2.2]
最近,我一直注意到主要的下游MTA(在我上面的示例中是1.1.1.1)将会超载,有时不能及时发送横幅问候。 在我这边,Sendmail会在maillog中抛出一个错误:
timeout waiting for input from [1.1.1.1] during client greeting
超时后,我看到系统发送到备份路由(在我上面的例子中的2.2.2.2),并立即被接受。
我有理由相信,这与负载有关,因为这些超时在高峰营业时间发生得更多。 这就是说,我想了解在处理新电子邮件和以前排队的邮件时,我的服务器正在启动多less个连接,这些连接都是针对同一个域的。
我认为 sendmail在单个文件中重试排队的邮件吗? 因此,如果我有10000封电子邮件推迟的邮件… queuerunner 不会启动10000个同时连接…它只会发出一个?
我也认为到达单独的SMTP会话的新来的邮件得到分别处理的权利? 因此,如果一个sendmail邮箱得到15个单独的新邮件,每个邮件都将由一个单独的sendmail子守护进程处理,这个守护进程将启动它自己到下游MTA的单独的SMTP连接?
有没有办法限制同时下游连接,而不会影响我的服务器可以处理的传入连接的数量?
你可以
1)使用dsmtp邮件程序有select地跳过“一次”传送尝试
(他们产生“每个smtp会话一个消息”交付)。
mailertable条目:
fooarchiveproviderdomain.com dsmtp:[1.1.1.1]:[2.2.2.2]
2)使用FEATURE(队列组)select自定义队列组,以便传送到fooarchiveproviderdomain.com
3)从多个选项中select如何从队列组中微调传送,例如通过队列组参数R=2 (两个并行运行器I=12m每个队列组运行两个SMTP会话)和I=12m (队列组中每12分钟处理消息)
您可以在不使用“一次性”投递尝试的情况下降低延迟,使用持久队列运行。
https://www.safaribooksonline.com/library/view/sendmail-cookbook/0596004710/ch09s06.html
评论 :改变消息如何通过“日志应用程序”发送是另一种select。