記。回憶

關於部落格
說想說的,記想記的;

未完待續。
  • 84003

    累積人氣

  • 4

    今日人氣

    0

    訂閱人氣

Postfix + dovecot,mbox lock 問題

mail 的 mbox 檔案由於有可能有兩支程式同時存取的問題,所以需要注意 file lock 的問題,不當的設定可能會造成 deadlock 產生,此時只能重啟 mail service 或將 lock 的 process kill 掉才能解套。
 
以 mail server 來說,我用的是 Postfix + dovecot,怎麼設定兩邊的 lock 方法,可以參考 http://wiki.dovecot.org/MboxLocking 的說明,主要是兩支程式的鎖定的方法與順序要一致就對了。
 
我的 postfix 裡的 main.cf 設定:
deliver_lock_attempts = 20 # 嘗試 20 次
deliver_lock_delay = 1s # 每次間隔 1 秒
mailbox_delivery_lock = dotlock, fcntl # 使用系統呼叫的 dotlock 或 fcntl
stale_lock_time = 500s # 500 秒後 lock 失效
virtual_mailbox_lock = dotlock, fcntl # virtual mailbox 的設定 (這個我沒在用也不懂)

我的 dovecot.conf 的設定:
mbox_read_locks = fcntl
mbox_write_locks = dotlock fcntl

不過我遇到了另外一個問題是,mail server 有設定 alias 信箱的情況下,若在寄送給 alias 的轉寄過程中,剛好有一位 alias list 裡的 user mbox 剛好是 lock 的話 (可能正在用 dovecot pop3 收信),mail server 就會因此 fail 而再寄一次,造成其他 alias list 的人收到這封信超過兩次以上。
 
目前這個問題我尚無解,尤其當有同事在國外收大檔的信件時整個收信時間比較久,剛好別的同事發個公告到 alias 信箱,就會造成全公司同事可能收到三四封公告。
 
我現在是先加大了 deliver_lock_attempts 和 deliver_lock_delay 的值,讓 postfix 可以試得久一點 (20 x 1s 加大為 30 x 20s),減低遇到 lock 的機會,但偶爾還是會遇上,並非根本辦法就是了。
 2010 年 5 月 20 日補充
 
在 Dovecot 的 wiki 中有提到,dotlock 是很常見的 mbox lock 方式,但是 lock 可發生在讀取 / 寫入兩種事情上面,而讀取上 dotlock 方式並不太具有效能,我猜想是因為讀取不太需要完整的 lock, 寫入才需要很嚴謹的 lock 的緣故?
 
不管如何,我們發現在 dovecot 安裝完成後,dovecot 在 mbox_read_locks 的設定預設是 fcntl,mbox_write_locks 的設定預設則使用了 dotlock fcntl。換句話說 dovecot 想要使用效能相對較快的 fcntl 來讀 mbox,但可以讓其他 process (可能是另一個 pop3,或是 postfix) 採用 dotlock 來寫。
 
而 postfix 預設的設定卻是 mailbox_delivery_lock = fcntl, dotlock,看來 postfix 也想使用 fcntl 來 lock 它的 mbox,但 dovecot 的 wiki 明白指出,如果 lock 方法的順序不一樣,可能會造成 deadlock。
 
所以我就以 postfix  不動為主,把 dovecot 的 mbox_write_locks 預設順序對調,但幾個月觀察下來,某個 user 的 mbox 因為超過 1GB,常會發生 pop3 意外終止的情形,我不知道這是怎麼回事,也拉長了 Outlook 在收信時的逾時設定,但是就不見改善。
 
因此我回過頭來思考,dovecot 要處理讀與寫 mbox 的工作,postfix 則只要處理寫這件事,我是不是應該以 dovecot 的預設設定比較好呢?所以我就把 dovecot 的設定調回來,而更改了 postfix 寫 mbox 的 lock 方法順序,接下來就持續觀察是否有改善了...
相簿設定
標籤設定
相簿狀態