在 ubuntu 上運行 postfix,每天發送大量郵件(約 100 萬條訊息)。負載非常高,但 CPU 和記憶體負載並不多。有人遇到類似情況並知道如何消除瓶頸嗎?
該伺服器上的所有郵件都是出站的。
我不得不假設瓶頸是磁碟。
只是更新,iostat 如下圖所示:
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.12 99.88 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 12.38 0.00 2.48 0.00 118.81 48.00 0.00 0.00 0.00 0.00
sdb 1.49 22.28 72.28 42.57 629.70 1041.58 14.55 135.56 834.31 8.71 100.00
這些數字是否符合您對單一磁碟的預期效能?
sdb 專用於 postfix。
我認為這是隊列洗牌,從傳入->活動->延遲
問題的更多詳細資訊:
伺服器:四核心 Xeon(R) CPU E5405 @ 2.00GH,附 4 GB 內存
平均負載:464.88、489.11、483.91、4 核心。但記憶體利用率和CPU利用率極低
Postfix 實例在 16 - 32 之間
答案1
這可能聽起來有點瘋狂,但你應該:
- 將日誌記錄減少到您需要的最低限度。使 syslog 僅記錄 mail.err 或更高版本。
- 添加更多內存。是的,Postfix 不需要它,但是額外的 RAM 意味著核心需要額外的頁面快取。
- 您沒有提到 /dev/sdb 上的檔案系統(這也很重要),但肯定會將其切換到
noatime
,這應該至少會減少一點負載。 - 看看你的 /var/spool/postfix 有多大。如果它是在幾個演出下,請考慮將其移至虛擬磁碟。
答案2
我不同意那些建議使用 RAM 磁碟作為“/var/spool/postfix”的人。這意味著您的整個郵件佇列將儲存在 RAM 中。如果您的伺服器崩潰或斷電,佇列中的訊息將永遠消失。從客戶端/用戶的角度來看,這確實很糟糕,因為訊息已經被成功接受傳遞。更糟的是,您的伺服器不會發送通知,說明電子郵件已退回或無法送達,因為當伺服器恢復時佇列將為空。
相反,我會添加盡可能多的快速磁碟,您可以負擔得起;根據所提供的信息,我無法真正估計您需要多少。從上面的“iostat”輸出來看,您似乎正在對“sdb”執行約 120 IOPS(r/s 和 w/s 的總和)。您可以合理地估計單一 15k RPM SCSI 或 FC 磁碟將處理 150 IOPS。我會從 5 個 15k RPM SCSI 磁碟和一個不錯的 RAID 控制器開始。將其設定為跨 4 個磁碟機(帶 1 個熱備用)的 RAID-10。我不確定這是否能完全解決你的問題,但絕對不會讓問題變得更糟。
答案3
在某些分析器(gprof?)下執行 postfix,或檢視日誌。 Postfix 記錄了大量的計時訊息,這些訊息可能會告訴您阻塞在哪裡。常見的地方有:
- 磁碟效能。也許是時候對您的隊列進行 RAID-10 了。
- 訊息上的任何類型的網路 IO。 DNS 黑名單?薩維?
- 您安裝的過濾器和其他過濾器。
- 透過網路或進程(ldap、sql)進行身份驗證和 UID 查找。
- 不使用代理:對於慢速地圖(如上)
答案4
看起來您的磁碟子系統至少應該被視為問題的一部分。由於 postfix 在 /var 周圍整理文件的方式,我建議在谷歌上搜尋「tweak ext3 filesystem」(至少設定 noatime 和 writeback),看看是否無法提高檔案系統層級的效能。
我有兩個伺服器集群,它們對客戶發送的電子郵件執行雙重任務 DNS 和出站 SMTP,每天運行 250k 則訊息(2k-10k/小時),而與此類 I/O 綁定相差甚遠。