使用/etc/aliases的群組方式,在Postfix為MBox的模式下,因外站遠端連入收信時間很久,故會遇到MBOX模式下 LOCK 檔案造成重複收信的問題,解決這個LOCK的最根本方式就是把 Mbox 改為 maildir 的格式,這兩個格式的介紹:
http://www.extmail.org/forum/viewthread.php?tid=10560&extra=page%3D1&frombbs=1
今天晚上在花時間轉格式看看。
========================================================================
最近我又遇到這個問題,兩間公司合併但還是各自獨立網段,MAIL SERVER 整合後另一邊外站人太多,又習慣用 mail 傳檔, 2M上傳每天都滿載…..又因群組關係,每封信一卡就是好久,重複收信狀況超嚴重,信件延持收到也是很誇張,剛自己寫了個script,然後每10分鐘跑一次,同用到啟用中斷過程非常微小,卻可以把mailq內老是積50封因LOCK問題的信給寄出去清乾淨.
小插曲…如果有個天兵寄了5MB以上的檔案,想想看外站如果40個人同時收這信,2M上傳不知道要傳到何時才能把信傳給大家,這時候又中斷大家收信……想想USER又要重收信,看來要用這個Script真的要小心.
#!/bin/bash
/etc/init.d/dovecot stop
postqueue -f
/etc/init.d/dovecot start
已參照下面修改,暫時停止上面的SCRIPT,星期一再來觀察吧……
=========================================================================
文章出處:http://blog.yam.com/ymwen/article/25977088
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 方法順序,接下來就持續觀察是否有改善了…
近期留言