
我有幾個 Sendmail 伺服器,它們透過 SMTP 將大量(數十萬)日誌電子郵件轉發到下游存檔儲存庫。所有這些電子郵件都具有相同的收件者網域(我們稱之為「fooarchiveproviderdomain.com」)。在我這邊,我/etc/mail/mailertable
為存檔域設定了一個簡單的路由:
fooarchiveproviderdomain.com esmtp:[1.1.1.1]:[2.2.2.2]
最近,我注意到主要下游 MTA(在上面的範例中為 1.1.1.1)會過載,有時無法及時發回橫幅問候語。在我這邊,Sendmail 會在郵件日誌中拋出一個錯誤,如下所示:
timeout waiting for input from [1.1.1.1] during client greeting
超時後,我看到系統發送到備份路由(在上面的範例中為 2.2.2.2)並立即被接受。
我相當確定這與負載有關,因為這些超時在業務高峰時段發生得更多。話雖這麼說,我想了解我的伺服器在處理新電子郵件和之前排隊的消息時啟動了多少個連接,所有這些連接都針對同一網域。
我思考sendmail 會重試單一檔案中的排隊訊息,對嗎?因此,如果我有 10000 封電子郵件延遲訊息…queuerunner慣於發起 10000 個並發連線...它只會發出一個?
我也思考到達單獨 SMTP 會話的新傳入郵件會單獨處理,對嗎?因此,如果某個 sendmail 郵箱收到 15 條單獨的新郵件,那麼每條郵件都將由單獨的 sendmail 子守護程序處理,該守護程序將啟動它自己的與下游 MTA 的單獨 SMTP 連接?
有沒有辦法限制同時下行連線而不影響我的伺服器可以處理的傳入連線數量?
答案1
您可以
dsmtp
1) 使用郵件程式選擇性地跳過「立即」傳遞嘗試
(它們產生「每個 smtp 會話一則訊息」傳遞)。
mailertable
入口:
fooarchiveproviderdomain.com dsmtp:[1.1.1.1]:[2.2.2.2]
2) 使用 FEATURE(queuegroup) 選擇自訂佇列群組以進行交付fooarchiveproviderdomain.com
3) 從眾多選項中選擇如何微調佇列組的傳送,例如透過佇列組參數R=2
(兩個並行運行程序 = 每個佇列組執行兩個 SMTP 會話)和I=12m
(每 12 分鐘處理佇列組中的消息)
您可以使用持久性佇列運行程式來降低延遲,而無需「立即」進行傳遞嘗試。
https://www.safaribooksonline.com/library/view/sendmail-cookbook/0596004710/ch09s06.html
評論: 改變如何訊息由“日記應用程式”發送是另一種選擇。