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

Jus*_*inP 3 performance exim ramdisk tmpfs queue

我有一个电子邮件服务器,它是消息传递应用程序的一部分,它会看到很多吞吐量。我想在 RAMdisk 上挂载 Exim 的消息队列以最大化性能;吞吐速度是最重要的,而不是在崩溃或系统重启的情况下团结一致。我发现很多信息都说在 RAMdisk 上安装消息队列会有很大帮助,但没有关于如何执行此操作的真实信息。

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

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

谢谢 :)

Ric*_*ler 5

Ramdisk:影响

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


Ramdisk:配置一个 ramdisk

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

ls /dev/ram*
Run Code Online (Sandbox Code Playgroud)

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

fdisk -l /dev/ramX
Run Code Online (Sandbox Code Playgroud)

您可能希望增加默认空间分配。由于 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
Run Code Online (Sandbox Code Playgroud)

重新启动后,您的新 ramdisk 应反映更新的空间分配。由于使用日志文件系统格式化 ramdisk 毫无意义,我们将只使用 ext2:

mke2fs -m 0 /dev/ram0
Run Code Online (Sandbox Code Playgroud)

-m 0选项阻止 mke2fs 在文件系统上为 root 用户保留任何空间。您现在可以为 ramdisk 创建一个挂载点,挂载它,然后开始使用它。

mkdir /mnt/ramdisk
mount /dev/ram0 /mnt/ramdisk
df -h /dev/ram0
Run Code Online (Sandbox Code Playgroud)

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

chown -R username:groupname /mnt/ramdisk
Run Code Online (Sandbox Code Playgroud)

您现在可以像使用标准硬盘分区一样使用此分区。请注意,如果您卸载分区,您的数据不会丢失,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
Run Code Online (Sandbox Code Playgroud)


Ramdisk:Exim 配置

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

/mnt/ramdisk        /var/spool/exim        none        bind        0 0
Run Code Online (Sandbox Code Playgroud)

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

spool_directory = /mnt/ramdisk
Run Code Online (Sandbox Code Playgroud)

显然,您只会执行上述任一操作,而不是两者都执行。


更好的解决方案:tmpfs

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

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

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

mkdir /mnt/tmpfs
chown -R username:groupname /mnt/tmpfs
Run Code Online (Sandbox Code Playgroud)

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

#<fs>        <mountpoint>        <type>       <opts>                             <dump/pass>
tmpfs        /mnt/tmpfs          tmpfs        size=1G,nr_inodes=10k,mode=0700    0 0
Run Code Online (Sandbox Code Playgroud)

这将创建一个具有 10'000 个 inode 的 1GB tmpfs 分区。exim 配置与创建 ramdisk 时相同 - 告诉 Exim 新假脱机目录的位置位于/mnt/tmpfs或将现有假脱机目录绑定到/mnt/tmpfs挂载点。或者,您可以从一开始就将 tmpfs 分区挂载到 Exim 现有的 spool 目录 - 因此,不要对/etc/fstab文件进行上述更改,而是使用以下行:

#<fs>        <mountpoint>        <type>       <opts>                             <dump/pass>
tmpfs        /var/spool/exim     tmpfs        size=1G,nr_inodes=10k,mode=0700    0 0
Run Code Online (Sandbox Code Playgroud)


这个站点有一篇很好的文章解释了 tmpfs 和 ramdisk,以及它们之间的区别。