У меня есть почтовый сервер, который является частью приложения для обмена сообщениями, и он будет иметь большую пропускную способность. Я хочу смонтировать очередь сообщений eximʻa на RAMdisk, чтобы максимизировать производительность; Скорость передачи данных важнее всего, в отличие от солидарности в случае сбоя или перезагрузки системы. Я нашел много информации о том, что установка очереди сообщений на RAMdisk может немного помочь, но нет реальной информации о том, как это сделать.
Я почти уверен, что очередь сообщений по умолчанию находится в / var / spool / exim, и что я могу использовать tmpfs для монтирования RAMdisk. Как именно я могу смонтировать RAM-диск при загрузке и использовать его в очереди сообщений Exim?
Т.е. какая команда должна быть для монтирования этого RAMdisk, и где я могу поместить эту команду, чтобы она выполнялась при загрузке машины (но до запуска Exim)?
Спасибо :)
split_spool_directory
в файле конфигурации, и Exim будет более эффективно обрабатывать большие очереди, разбивая сообщения на подкаталоги вместо одного каталога спула.Во многих дистрибутивах Linux уже есть несколько предварительно настроенных, но неиспользуемых RAM-дисков. Выполните следующую команду, чтобы вывести список ваших текущих RAM-дисков:
ls /dev/ram*
Чтобы увидеть распределение размера, используйте fdisk
стандартным образом: (где X
это номер вашего RAM-диска)
fdisk -l /dev/ramX
Возможно, вы захотите увеличить выделенное по умолчанию пространство. Поскольку размер виртуального диска контролируется ядром, вам нужно будет установить параметр ядра, чтобы увеличить выделенное пространство. Если ваш загрузчик GRUB, вы можете отредактировать grub.conf
файл и добавьте ramdisk_size
вариант ядра. Ваш файл конфигурации GRUB должен выглядеть примерно так: (в этом примере мы устанавливаем размер RAM-диска равным 256 МБ)
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
После перезагрузки ваши новые RAM-диски должны отражать обновленное выделенное пространство. Поскольку нет смысла форматировать 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
Теперь вы можете использовать этот раздел, как если бы он был стандартным разделом жесткого диска. Обратите внимание, что если вы отключите раздел, ваши данные не будут потеряны, а ОЗУ будет не быть освобожденным, так как ядро постоянно выделяет необходимое пространство до перезагрузки.
Чтобы автоматизировать эту процедуру, добавьте в свой /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
Вы можете выполнить монтирование с привязкой, чтобы Exim продолжил запись в свой стандартный каталог спула. Для этого добавьте следующую строку в свой /etc/fstab
файл:
/mnt/ramdisk /var/spool/exim none bind 0 0
В качестве альтернативы, вы можете просто указать exim'у на точку монтирования ramdisk. Для этого вам необходимо установить следующее в exim.conf
файл:
spool_directory = /mnt/ramdisk
Очевидно, вы сделаете только одно из вышеперечисленных, а не оба.
Вместо использования ramdisk лучше использовать tmpfs, поддерживаемый ядром Linux 2.4 и выше. Преимущество использования tmpfs заключается в том, что память назначается динамически, что делает его гораздо более гибким решением, чем ramdisks. Вдобавок, если в вашем разделе 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
Это создаст раздел tmpfs размером 1 ГБ с 10'000 индексными дескрипторами. Конфигурация exim такая же, как и при создании ramdisk - либо скажите exim, что местоположение нового каталога спула находится в /mnt/tmpfs
или привяжите существующий каталог спула к /mnt/tmpfs
точка крепления. В качестве альтернативы, вы можете просто смонтировать раздел tmpfs в существующий каталог спула eximʻa с самого начала - поэтому вместо вышеуказанных изменений в /etc/fstab
файл, используйте вместо этого эту строку:
#<fs> <mountpoint> <type> <opts> <dump/pass>
tmpfs /var/spool/exim tmpfs size=1G,nr_inodes=10k,mode=0700 0 0
Этот сайт есть хорошая статья, объясняющая tmpfs и ramdisks, а также различия между ними.
Как уже было сказано, размещение каталога спула в ОЗУ tempfs рискованно, поскольку вы можете потерять все электронные письма в очереди в случае сбоя сервера. Я получил очень хорошую производительность, поместив /var/spool/exim/input
и /var/spool/exim/msglog
каталоги на SSD-диске (более 60000 отправляемых писем в час на дешевом настольном оборудовании).
В /var/spool/exim/db
Каталог желательно разместить на виртуальном диске (символическая ссылка на этот каталог на / dev / shm - самый простой способ), поскольку потеря подсказок повтора не фатальна.
Также фактом является то, что exim будет довольно плохо мусорить, если у вас в очереди несколько тысяч электронных писем или больше, поскольку процессы обработчика очереди будут тратить пропорционально больше времени, спотыкаясь друг о друге и проверяя блокировки, чем фактически доставляя электронные письма. Быстрые диски (SSD или RAM), безусловно, помогают, но всегда лучше держать короткую очередь!
Я бы просто использовал / dev / shm, который уже установлен по умолчанию в большинстве современных дистрибутивов Linux.
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 куда-нибудь в / dev / shm /.
вы можете использовать tmpfs и смонтировать ramdisk, это несложно.
Там есть это сообщение в блоге это подробно описывает создание tmpfs и изменение сценария запуска exim, чтобы сделать его немного более надежным.
Прежде чем продолжить, составьте сообщение, которое вы отправите пользователям, обнаруженным в результате анализа журнала почтового сервера, с информацией о том, что ваш сервер только что потерял свое сообщение из-за отключения электроэнергии / перезагрузки / сбоя / отключения кабеля питания человеком.
Почтовые серверы очень серьезно относятся к гарантиям сохранения данных. Они прилагают большие усилия, чтобы убедиться, что, когда они берут на себя ответственность за почту пользователя, это сообщение находится в безопасности на диске и выдержит сбой / перезагрузку или любое другое событие, которое стирает содержимое ОЗУ системы. Вы позаботитесь о том, чтобы их усилия были потрачены зря. Вы уверены, что хотите это сделать?
Здесь вы потеряете данные пользователя из-за множества сценариев, включая чистую перезагрузку или выключение машины. Пожалуйста, поищите другую идею по настройке производительности почтового сервера.