在 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 很少
16 - 32 之间的后缀实例
答案1
这听起来可能有点疯狂,但你应该:
- 将日志记录减少到所需的最低限度。使 syslog 仅记录 mail.err 或更高级别的错误。
- 添加更多 RAM。是的,Postfix 不需要它,但额外的 RAM 意味着内核的额外页面缓存。
- 您没有提到 /dev/sdb 上的文件系统是什么(这也很重要),但肯定将其切换到
noatime
,这至少可以减轻一点负载。 - 查看 /var/spool/postfix 有多大。如果少于几 GB,请考虑将其移动到 ramdisk。
答案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 个驱动器上的 RAID-10,并带有 1 个热备用。我不确定这是否能完全解决您的问题,但肯定不会使问题变得更糟。
答案3
在某些分析器(gprof?)下运行 postfix,或者查看日志。Postfix 会记录大量时间信息,这些信息可能会告诉您延迟在哪里。常见的查看位置是:
- 磁盘性能。您的队列可能是时候使用 RAID-10 了。
- 消息上有任何类型的网络 IO。DNS 黑名单?SAV?
- 您安装的过滤机和其他过滤器。
- 通过网络或进程(ldap、sql)进行身份验证和 UID 查找。
- 不使用代理:对于慢速地图(如上)
答案4
看起来您的磁盘子系统至少应该被视为问题的一部分。由于 postfix 在 /var 中移动文件的方式,我建议在 Google 上搜索“调整 ext3 文件系统”(至少设置 noatime 和 writeback)以查看您是否无法在文件系统级别提高性能。
我有两组服务器,它们同时承担着发往客户电子邮件的 DNS 和出站 SMTP 任务,每天运行 25 万条消息(每小时 2k-10k 条),但几乎没有这种 I/O 绑定。