要定義一個項目列表以指派給 postfix 中的許多不同選項,您可以使用逗號分隔的列表,如下所示:
relay_domains = example.com,example.net,example.org
或像這樣的哈希映射:
relay_domains = hash:/etc/postfix/relay_domains
然後使用 postmap 將鍵、值項的檔案轉換為 bdb 檔案。
我的問題是:使用哈希映射而不是僅僅指定列表是否有任何性能原因?
答案1
我沒有數據或指標來確定性能在這兩種情況下是否重要。我將嘗試解釋涉及這兩個案例的後台流程。
當 postfix 守護程式運行時,這兩者之間幾乎沒有什麼區別,因為:
- 使用時
main.cf
,postfix 解析設定文件,將其儲存到記憶體中,並且在 postfix 重新啟動或管理員發出命令之前不會再次檢查該檔案postfix reload
。 - 當使用雜湊表時,postfix 解析該表,將其儲存到記憶體中並定期檢查檔案是否已變更。如果資料庫發生更改,postfix 將在處理下一個客戶端請求之前終止,以便新進程可以使用新資料庫進行初始化。來源
現在,如果您想更改列表,那麼
- 更改後
main.cf
,您應該調用postfix reload
.它將強制主守護程序重新讀取設定檔並終止子進程,以便它可以獲得新的配置。來源 - 更改哈希表後,無需呼叫
postfix reload
。
postfix reload
我仍然不明白(1)透過手動呼叫重新啟動子進程和(2)由哈希表觸發的重新啟動子進程已被修改之間的區別。
讀完後有一些知識postfix 手冊頁,特別是在守護程式部分。這幫助我理解(1)透過手動呼叫重新啟動子進程postfix reload
和(2)透過修改雜湊表觸發重新啟動子進程之間的差異。
Postfix 的主程序稱為掌握。它是第一次調用並作為“主”程式。它按需調用其他守護進程,例如 smtpd、qmgr、trivial-rewrite。
有四種 postfix 守護程式
- 該守護程式不會死亡,因此它不會自動取得 main.cf 的變更。配置更改後呼叫
postfix reload
將使進程重新讀取它。這包括:掌握。 - 此守護程序成為持久進程,因此它不會自動擷取對 main.cf 的變更。配置更改後呼叫
postfix reload
將使進程重新讀取它。這包括:qmgr,tlsmgr,核實。 - 長時間運行的進程可以運行一小時或幾個小時。配置更改後呼叫
postfix reload
將加快配置更改速度。這包括:簡單重寫,撿起,後螢幕,代理映射 - 只運行有限時間的短運行進程。不需要調用
postfix reload
,因為進程再次運行時會重新讀取 main.cf。這包括郵件傳輸協定,郵件發送,當地的以及除上述三類之外的其他過程。
如果您用於main.cf
存儲列表但不調用postfix reload
,那麼
- 由於壽命較短,守護程式類別 4 將在進程恢復後立即拾取它。
- 守護程式類別 3 需要一些時間才能生效
- 守護程式類別 1 和 2 永遠不會重新讀取,
main.cf
直到您呼叫postfix reload
:
當您使用哈希表來存儲列表並且您對postmap
文件進行 -ed 時,那麼
- 守護程式類別 2、3、4 將偵測檔案變更。所以不需要做 postfix 重新載入。
- 守護程式類別 1 沒有哈希類型參數值。所以,它對 master daemon 沒有影響。
結論
否則,看起來上述兩種情況之間的性能差異很小。如果您很少更改表格,那麼差異可以忽略不計。例外的是,如果您頻繁地執行或更改哈希表,那麼在過程postfix reload
中就會出現效能問題。qmgr
看這裡和這裡
更多資訊:Postfix 效能自述文件