提高 Exim 性能:在 RAMdisk 上挂载消息队列

提高 Exim 性能:在 RAMdisk 上挂载消息队列

我有一个电子邮件服务器,它是消息应用程序的一部分,它将产生很大的吞吐量。我想将 Exim 的消息队列安装在 RAMdisk 上以最大限度地提高性能;吞吐量速度是最重要的,而不是在崩溃或系统重启时保持稳定性。我发现很多信息都说将消息队列安装在 RAMdisk 上会有很大帮助,但没有关于如何做到这一点的实际信息。

我非常确定消息队列默认位于 /var/spool/exim 中,并且我可以使用 tmpfs 来挂载 RAMdisk。我究竟该如何在启动时挂载 RAMdisk,并让 Exim 的消息队列使用它?

即,安装此 RAMdisk 的命令是什么,我应该把这个命令放在哪里以便它在机器启动时执行(但在 Exim 启动之前)?

谢谢 :)

答案1

Ramdisk:含义

  • 只有当您的应用程序受 IO 限制(特别是硬盘)时,使用 ramdisk 才有用。除非您通过快速光纤链路发送数千条消息,否则主要限制因素可能是互联网连接速度,而不是硬盘速度。
  • Exim 已经非常擅长处理硬盘等“慢速”介质上的大型队列;只需split_spool_directory在配置文件中设置,Exim 就会通过将消息拆分到子目录而不是单个假脱机目录来更有效地处理大型队列。
  • 如果将消息缓存到 ramdisk 中,则在发生重启或断电时可能会丢失整个队列,并且无法恢复队列。
  • 假脱机目录可能会变得非常庞大,并且您可能会很快耗尽 ramdisk 分区上的空间。几封带有大附件的电子邮件很容易填满一个相当大的 ramdisk。同样,无法立即投递的消息会停留在队列中,直到成功投递、手动删除或由 Exim 使其过期,尽管这是 Exim 配置文件中的可配置设置。


Ramdisk:配置 ramdisk

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

ls /dev/ram*

要查看大小分配,请fdisk以标准方式使用:(X您的 ramdisk 号码在哪里)

fdisk -l /dev/ramX

您可能希望增加默认空间分配。由于 ramdisk 大小由内核控制,因此您需要设置内核选项来增加分配的空间。如果您的引导加载程序是 GRUB,您可以编辑文件grub.conf并添加ramdisk_size内核选项。您的 GRUB 配置文件应该如下所示:(在此示例中,我们将 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 创建挂载点,挂载它并开始使用它。

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

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

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:Exim 配置

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

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

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

spool_directory = /mnt/ramdisk

显然,您只会做上述其中之一,而不是同时做两者。


更好的解决方案:tmpfs

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

使用 tmpfs,您无需执行上述 ramdisk 解决方案所需的任何步骤。成功配置 tmpfs 需要以下步骤:

创建挂载点并设置正确的权限:

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

接下来,打开您的/etc/fstab文件并设置在启动时创建和挂载的 tmpfs 分区:

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

这将创建一个 1GB 的 tmpfs 分区,其中包含 10,000 个 inode。exim 配置与创建 ramdisk 时相同 - 要么告诉 Exim 新假脱机目录的位置,/mnt/tmpfs要么将现有假脱机目录绑定到/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 和 ramdisk 以及它们之间的区别。

答案2

在您继续之前,请撰写一条消息,发送给邮件服务器日志解析发现的用户,告知他们您的服务器由于断电/重启/崩溃/人为绊倒电源线而丢失了他们的消息。

邮件服务器非常重视数据持久性保证。他们竭尽全力确保当他们负责用户的邮件时,该邮件在磁盘上是安全的,并且能够在崩溃/重启或任何其他清除系统 RAM 内容的事件中幸存下来。您要确保他们的努力不会白费。您确定要这样做吗?

您可能会因为多种情况而丢失用户数据,包括机器的完全重启或关闭。请搜索有关邮件服务器性能调整的其他想法。

答案3

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

这篇博文详细说明了创建 tmpfs 和修改 exim 启动脚本以使其更加健壮。

答案4

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

最好将该/var/spool/exim/db目录放在 ramdisk 上(将该目录符号链接到 /dev/shm 是最简单的方法),因为丢失重试提示并不致命。

事实上,如果队列中有几千封或更多电子邮件,exim 会相当糟糕,因为队列运行器进程将花费更多时间来相互碰撞和检查锁,而不是真正地发送邮件。快速磁盘(SSD 或基于 RAM)肯定有帮助,但保持队列短总是更好!

相关内容