提高Exim性能:在RAMdisk上安装消息队列

我有一个电子邮件服务器,是消息传递应用程序的一部分,它将看到很多的吞吐量。 我希望将Exim的消息队列安装在RAMdisk上以最大化性能; 吞吐量速度是最重要的,而不是在崩溃或系统重启的情况下团结一致。 我发现很多信息说在RAMdisk上安装消息队列会有所帮助,但是没有真正的信息来说明如何做到这一点。

我很确定默认情况下,消息队列在/ var / spool / exim中,我可以使用tmpfs来装载RAMdisk。 如何在启动时加载RAMdisk,让Exim的消息队列使用它?

即什么命令将这个RAMdisk,并在那里我将这个命令,以便它执行时,机器启动(但在Exim启动之前)?

谢谢 :)

Ramdisk:暗示

  • 使用虚拟磁盘只有当你的应用程序是IO绑定,特别是对你的硬盘有用。 除非您通过快速光纤链路发送数千条消息,否则您的主要限制因素可能就是您的Internet连接速度,而不是硬盘的速度。
  • Exim已经非常擅长处理“慢”介质(如硬盘)上的大量队列, 只需在configuration文件中设置split_spool_directory ,并且Exim将通过将消息拆分到子目录而不是单个假脱机目录来更有效地处理大型队列。
  • 将信息假脱机到虚拟磁盘可能会导致在重新启动或停电的情况下丢失整个队列,无法恢复队列。
  • 假脱机目录可能变得非常庞大,并且很快就有可能导致虚拟磁盘分区上的空间不足。 一些大附件的电子邮件甚至可以很容易地填满一个相当大的ramdisk。 类似地,无法立即传送的消息将在队列中成功传送,手动删除或由Exim过期,尽pipe这是Eximconfiguration文件中的可configuration设置。

Ramdisk:configurationramdisk

许多Linux发行版已经有一些预configuration但未使用的ramdisk。 运行以下命令以列出当前的ramdisk:

 ls /dev/ram* 

要查看大小分配,请以标准方式使用fdisk :(其中X是您的内存盘号)

 fdisk -l /dev/ramX 

您可能会想要增加默认的空间分配。 由于ramdisk的大小是由内核控制的,所以你需要设置一个内核选项来增加分配的空间。 如果您的引导加载程序是GRUB,则可以编辑grub.conf文件并添加ramdisk_size内核选项。 你的GRUBconfiguration文件应该如下所示:(在这个例子中,我们将ramdisk的大小设置为256MB)

 default 0 timeout 5 hiddenmenu splashimage=(hd0,1)/boot/grub/splash.xpm.gz title=Gentoo Gateway Server root (hd0,1) kernel /boot/vmlinuz root=/dev/sda2 ramdisk_size=256000 

重新启动后,新的ramdisk应该反映更新的空间分配。 由于使用日记文件系统格式化ramdisk没有意义,所以我们只使用ext2:

 mke2fs -m 0 /dev/ram0 

-m 0选项让mke2fs为root用户保留文件系统上的任何空间。 您现在可以为ramdisk创build一个安装点,安装它并开始使用它。

 mkdir /mnt/ramdisk mount /dev/ram0 /mnt/ramdisk df -h /dev/ram0 

此外,请确保您在加载点上设置了正确的权限(将用户名和组名用正确的组和用户replace为您的系统):

 chown -R username:groupname /mnt/ramdisk 

您现在可以像使用标准硬盘分区一样使用此分区。 请注意,如果您卸载分区,则数据不会丢失,并且不会释放RAM,因为内核将永久分配所需的空间,直到重新启动。

要自动执行此过程,请将以下内容添加到/etc/rc.local脚本中:

 /sbin/mke2fs -q -m 0 /dev/ram0 /bin/mount /dev/ram0 /mnt/ramdisk /bin/chown username:groupname /mnt/ramdisk /bin/chmod 0750 /mnt/ramdisk 

Ramdisk:Eximconfiguration

您可以执行绑定装入,以便Exim将继续写入其标准的假脱机目录。 为此,请将以下行添加到/etc/fstab文件中:

 /mnt/ramdisk /var/spool/exim none bind 0 0 

或者,您可以将Exim指向ramdisk挂载点。 为此,您需要在exim.conf文件中设置以下内容:

 spool_directory = /mnt/ramdisk 

显然,你只会做上述任何一个,而不是两个。

更好的解决scheme:tmpfs

而不是使用ramdisk,而是使用Linux内核2.4及以上版本支持的tmpfs。 使用tmpfs的好处是内存是dynamic分配的,使得它比ramdisk更灵活的解决scheme。 此外,如果您的tmpfs分区空间不足,内核将自动开始将数据分页到您的硬盘,而ramdisk解决scheme只会导致Exim停止处理消息并崩溃。

使用tmpfs,您不需要执行上述ramdisk解决scheme所需的任何步骤。 成功的tmpfsconfiguration需要以下步骤:

创build一个安装点并设置正确的权限:

 mkdir /mnt/tmpfs chown -R username:groupname /mnt/tmpfs 

接下来,打开你的/etc/fstab文件,并设置tmpfs分区在引导时被创build和挂载:

 #<fs> <mountpoint> <type> <opts> <dump/pass> tmpfs /mnt/tmpfs tmpfs size=1G,nr_inodes=10k,mode=0700 0 0 

这将创build一个具有10'000个节点的1GB tmpfs分区。 eximconfiguration与创buildramdisk相同 – 告诉Exim新的spool目录位于/mnt/tmpfs或将现有的spool目录绑定到/mnt/tmpfs挂载点。 或者,您可以从一开始就将tmpfs分区挂载到Exim的现有假脱机目录中,而不是对/etc/fstab文件进行上述更改,而是使用以下代码行:

 #<fs> <mountpoint> <type> <opts> <dump/pass> tmpfs /var/spool/exim tmpfs size=1G,nr_inodes=10k,mode=0700 0 0 

这个网站有一个很好的文章解释tmpfs和ramdisks,以及它们之间的差异。

在继续之前,请编写一个消息,您将发送给通过邮件服务器日志parsing发现的用户,通知他们您的服务器由于断电/重新启动/崩溃/人为的在电力电缆上跳闸而丢失了他们的消息。

邮件服务器对于数据持久性保证非常认真。 他们非常痛苦,以确保当他们承担用户的邮件的责任,这个消息是安全的磁盘上,并将继续崩溃/重新启动或擦除系统内存的任何其他事件的内容。 你要确定,他们的努力将被浪费。 你确定要这样做吗?

在这里,您将通过过多的场景丢失用户的数据,包括干净的重启或关机。 请search关于邮件服务器性能调整的其他一些想法。

你可以使用tmpfs并挂载ramdisk,这并不复杂。

有这个博客文章 ,详细创buildtmpfs和修改exim启动脚本,使其更强大一点。

我只是使用在大多数现代Linux发行版中默认挂载的/ dev / shm。

 vz1:~# df -h /dev/shm Filesystem Size Used Avail Use% Mounted on tmpfs 12G 0 12G 0% /dev/shm vz1:~# mount |grep shm tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev) vz1:/dev/shm# dd if=/dev/zero of=5gb.dat bs=1M count=5000 conv=fsync 5000+0 records in 5000+0 records out 5242880000 bytes (5.2 GB) copied, 7.36568 s, 712 MB/s vz1:/dev/shm# time dd if=5gb.dat of=/dev/null bs=1M 5000+0 records in 5000+0 records out 5242880000 bytes (5.2 GB) copied, 2.70614 s, 1.9 GB/s 

只要确保你监控它; 填充它可能是坏的。

然后更新Exim init.d启动脚本,将/ var spool目录移动到/ dev / shm / somewhere。

如前所述,将spool目录放在tempfs的RAM中是有风险的,因为如果服务器崩溃,可能会丢失队列中的所有电子邮件。 通过在SSD驱动器上放置/var/spool/exim/input/var/spool/exim/msglog目录(在廉价桌面硬件上每小时发送超过60000封电子邮件),我获得了非常好的性能。

/var/spool/exim/db目录最好放在一个ramdisk上(symlink / dev / shm目录是最简单的方法),因为丢失重试提示并不是致命的。

这也是一个事实,即如果队列中有几千封电子邮件或者更多的邮件,那么exim会比较糟糕,因为队列运行程序将花费更多的时间在比对方更多的时间上绊倒对方,检查锁而不是实际收到邮件。 快速的磁盘(基于SSD或RAM)确实有帮助,但保持队列短小总是更好!