Как найти причину медленного поиска в Dovecot
Медленный поиск в Dovecot не лечится одной универсальной настройкой. Я начинаю с измерений: проверяю, какой запрос тормозит, что происходит с индексами и диском, и только затем меняю конфигурацию. Формат хранения и кэш могут иметь значение, но менять их вслепую опасно.
Сначала подтвердите, что тормозит именно поиск
Когда пользователь говорит «поиск завис», я уточняю, что именно он делал: искал по отправителю, теме или всему тексту, в одной папке или сразу во всех. Веб-почта может ждать ответа IMAP, но задержку способны добавить и сама веб-почта, и сеть, и сервер хранения. Поэтому спиннер в браузере ещё не доказывает, что виноват Dovecot. Сначала сравниваю одинаковый запрос в разных папках и у разных пользователей, фиксирую время ответа и проверяю, совпадает ли проблема с нагрузкой на диски.
Индексы Dovecot помогают обслуживать почтовые ящики, но из этого не следует, что любой поиск мгновенно использует готовый индекс или что каждый медленный запрос вызван его отсутствием. Поиск по тексту письма может требовать чтения содержимого; поведение зависит от используемых функций и архитектуры. Если индексы повреждены, Dovecot может синхронизировать их с хранилищем, а если хранилище отвечает медленно, индексация сама станет заложником задержек. «Диск кричит о помощи» звучит эффектно, но нужны графики задержки, очереди и журнал, а не диагноз по метафоре.
Я бы не стал записывать в историю компании выдуманный кейс с точными датами, числом ящиков и объёмом каждого ящика. Здесь оставляю условный сценарий: сотрудник видит задержку в веб-почте, а администратор проверяет сервер и клиент отдельно. Такой пример полезнее сказки о чудесном исправлении за два часа: он показывает порядок действий, который можно повторить и проверить.
Полезно также зафиксировать, сколько времени занимает сам поиск и сколько — открытие папки без поиска. Это разные операции, и одинаково выглядящий индикатор ожидания может скрывать разную работу. Снимите несколько наблюдений в обычное время и в период жалоб, запишите клиента, папку и тип запроса. Если сравнивать разные действия, получится не диагностика, а коллекция цифр без смысла.
Maildir, sdbox и mdbox: формат выбирают по условиям
Maildir хранит отдельные сообщения файлами внутри структуры каталогов. Это не означает автоматически, что формат плох или что его надо срочно менять. На результат влияют файловая система, число сообщений и папок, характер доступа, расположение индексов и нагрузка на хранилище. На одной системе Maildir работает приемлемо; на другой перебор множества файлов и метаданных может стать заметной частью задержки. Сначала измерьте симптомы, а не объявляйте формат виновным по названию.
Dovecot поддерживает dbox: sdbox хранит одно сообщение в файле, а mdbox объединяет несколько сообщений в файлы. Это не «один файл на весь ящик», как утверждал исходный текст. Dovecot описывает dbox как собственный высокопроизводительный формат, однако переход не является бесплатным ускорением: меняется схема хранения, нужны проверенная процедура миграции, место для данных и план отката. У dbox есть особенно важное требование: индексные файлы нельзя потерять, иначе возможна потеря данных. Вот деталь, которую рекламная фраза «меньше операций — быстрее» обычно забывает.
Перед миграцией я проверяю активную конфигурацию командой doveconf -n и выясняю, не переопределяет ли путь база пользователей или namespace. В типичной конфигурации mail_location может выглядеть как maildir:~/Maildir или mdbox:~/mdbox, но одного поиска этой строки недостаточно, если расположение задаётся для отдельных пользователей. Конвертацию делают штатными средствами синхронизации Dovecot, на тестовой копии и с проверкой количества сообщений и папок. Переключить строку в конфиге и надеяться, что файлы сами переедут, — плохой план.
Формат нельзя выбирать только по максимальному размеру ящика. Учитывайте резервное копирование, инструменты восстановления, требования к обслуживанию и опыт команды. Удобный для миграции формат может оказаться предпочтительнее, чем предполагаемый выигрыш скорости, который ещё не измерили. Любое сравнение делайте на копии сопоставимого объёма и с одинаковым набором запросов.
- Maildir: сообщения хранятся отдельными файлами.
- sdbox: одно сообщение в файле.
- mdbox: несколько сообщений в файлах dbox.
Кэш Dovecot: настройте поля, а не проценты RAM
В исходном варианте фигурировали mail_cache_size и mail_index_cache_size как будто это штатные лимиты оперативной памяти. Для настройки поиска такой совет нельзя публиковать: эти названия не дают читателю воспроизводимого результата в поддерживаемой конфигурации. В Dovecot есть кэш полей писем, который формирует файлы dovecot.index.cache и пополняется с учётом того, какие поля использует IMAP-клиент. Это кэш на уровне папок и доступа, а не волшебный резерв RAM, которому достаточно назначить процент.
Параметры кэша надо выбирать под наблюдаемую нагрузку и конкретную версию Dovecot. В документации для ветки 2.3 перечислены, например, mail_cache_fields и mail_always_cache_fields; они определяют, какие поля кэшировать, а не объём памяти. Значение по умолчанию и доступные параметры различаются между версиями, поэтому проверяйте локальную документацию и вывод doveconf -n, прежде чем менять конфиг. Выдуманная рекомендация «отдайте кэшу четверть RAM» создаёт риск вытеснить память у других процессов и не обещает ускорить нужный запрос.
Сравните задержку на холодном и повторном поиске, нагрузку диска и характер запросов. Если повторный поиск заметно быстрее, кэширование может участвовать в картине; если одинаково медленно, причина может быть в чтении содержимого, очереди диска, клиенте или другом слое. Не включайте кэширование дополнительных полей наугад: оно может увеличить объём индексов и записи. Маленький график до и после изменения убедительнее любого совета выделить «значительную часть» памяти.
Проверьте, какие поля фактически использует клиент: заголовок, отправитель и тема ведут себя иначе, чем поиск по всему содержимому. Добавление полей в кэш может помочь повторяющимся запросам, но занимает место и увеличивает работу при записи. Поэтому настройка должна следовать за наблюдениями, а не предшествовать им. Универсального списка для всех почтовых клиентов нет.
- Проверьте версию Dovecot.
- Сравните холодный и повторный поиск.
- Не задавайте кэшу долю RAM наугад.
Индексатор и Maildir: не включайте вымышленные флаги
В Dovecot есть служба индексатора, но это не переключатель background_indexing=yes, который достаточно включить для магического фонового поиска. Исходные названия indexer_memory_limit и mail_user_service также не подтверждены как описанные в статье настройки. Поэтому я убрал их из списка рекомендаций. Сначала выясните, какая служба реально включена в данной сборке и конфигурации, что именно она индексирует, есть ли очередь заданий и почему запрос пользователя ждёт её завершения.
Не включайте maildir_stat_dirs=yes как универсальный оптимизатор. В документации Dovecot 2.3 эта настройка относится к Maildir и нужна, когда в каталоге есть начинающиеся с точки файлы, которые не являются каталогами почтовых папок. В таком случае Dovecot вызывает stat() для записей, что может ухудшить производительность; на некоторых файловых системах сведения о типе объекта доступны без этого вызова. Параметр не означает «отслеживать статические директории» и не чинит индекс при каждом подключении. Название оказалось убедительнее смысла — классическая ловушка конфигов.
После изменения одного параметра фиксируйте время одинакового запроса, проверяйте журналы и сравнивайте нагрузку. Не меняйте формат хранилища, кэш и планировщик одновременно: если стало лучше или хуже, иначе не поймёте почему. Перезапуск нужен только если его требует конкретное изменение; сначала проверьте конфигурацию штатной командой для установленной версии и предусмотрите способ вернуть прежнее состояние. Диагностика должна оставлять след: что было измерено, что изменили и каким результатом подтвердили вывод.
Если служба индексатора не активна, сначала выясните, предусмотрена ли она конфигурацией и нужна ли для вашей задачи. Не надо добавлять неизвестный блок параметров из чужой статьи. Версия, включённые плагины и схема доставки меняют детали. Сверяйте синтаксис с документацией именно установленной ветки и тестируйте конфигурацию до перезапуска.
- Проверьте реальные службы в конфигурации.
- maildir_stat_dirs относится к Maildir.
- Изменяйте одну настройку за раз.
Что показали измерения
Порядок проверки простой: воспроизведите запрос, отделите задержку веб-клиента от ответа IMAP, проверьте журналы и активную конфигурацию, посмотрите на дисковую нагрузку и только затем выбирайте изменение. Для каждого шага сохраните исходные значения и время ответа. Если тормозит одна папка, это направляет поиск в другую сторону, чем одинаковая задержка у всех пользователей. Если проблема проявляется лишь в веб-почте, сравните результат с другим IMAP-клиентом, не объявляя сервер виноватым заранее.
Резервная копия важна перед миграцией данных и серьёзными изменениями хранилища. Убедитесь, что копия действительно восстанавливается, а не просто существует в списке заданий. Для mdbox отдельно берегите индексы, поскольку документация предупреждает о риске их потери. Тестовая конвертация на копии, проверка папок и сообщений и заранее описанный откат занимают время, зато позволяют не проверять на сотрудниках, сколько стоит поспешность.
Если своих измерений недостаточно, аудит должен закончиться не обещанием «мгновенного поиска», а списком воспроизведённых задержек, причиной, планом изменений и критериями проверки. Иногда проблема находится в сервере хранения, иногда в веб-почте, сети или запросе. Я не обещаю, что новый формат или очередное значение параметра одинаково поможет всем: сначала данные, потом вывод. Настройка без проверки — это просто изменение, которому повезло.
Запишите исходное состояние до работы: версию, релевантный вывод конфигурации, время нескольких запросов и журналы за тот же интервал. Тогда результат можно будет повторить и передать другому администратору. Без исходного измерения даже субъективное «кажется быстрее» легко принять за эффект настройки, хотя изменился состав писем или нагрузка просто спала.
План диагностики и безопасных изменений
Если сервер действительно упирается в хранилище, сначала выясните, что именно замедляет операцию: случайное чтение, очередь, задержка записи или нехватка свободного места. Если процессор простаивает, а диск занят, замена процессора ничего не изменит. Если же задержка возникает до обращения к хранилищу, быстрый массив тоже не вылечит веб-интерфейс. Такие выводы должны опираться на сопоставимые измерения, а не на привычную войну «SSD против плохого конфига».
После исправления повторите те же запросы в сопоставимых условиях и проверьте журналы. Сравните не только лучший результат, но и обычное время ответа под типичной нагрузкой. Зафиксируйте версию Dovecot, активную конфигурацию и точное изменение: через месяц это сэкономит время при разборе новой жалобы. И если результат не изменился, отмените гипотезу и ищите дальше. Упрямство в администрировании дорого обходится; упрямство с графиком хотя бы выглядит убедительно.
Не связывайте сроки заранее с обещанием «пара часов»: длительность зависит от размера хранилища, числа пользователей и необходимости миграции. Сначала согласуйте окно работ, резервное копирование и критерии приёмки. Если достаточно настройки без переноса, это одна задача; если требуется конвертация, подготовка и проверка займут отдельное время.
- Сделайте полную резервную копию данных.
- Проверьте текущий формат хранения через doveconf.
- Настройте кэш и фоновую индексацию.
- Протестируйте работу после изменений.
- Мониторьте логи на предмет ошибок.
Частые вопросы
Как узнать активный формат хранения?
Начните с `doveconf -n` и найдите `mail_location`. Проверьте также userdb и namespace: они могут задавать расположение отдельно для пользователя или папки.
Нужно ли выделять под кэш четверть оперативной памяти?
Нет универсальной доли RAM. Сначала выясните, какие поля кэшируются и какой запрос медленный. Доступные параметры зависят от версии Dovecot.
`maildir_stat_dirs=yes` ускорит поиск?
Не как универсальная настройка. В Dovecot 2.3 она относится к обработке Maildir и может добавить вызовы stat(); применяйте её только при соответствующей проблеме с записями каталогов.
Можно ли перейти с Maildir на mdbox?
Да, миграция возможна штатной синхронизацией Dovecot. Сначала проверьте процедуру на копии, сделайте проверяемую резервную копию и не теряйте индексы dbox.
Что проверять, если повторный поиск всё ещё медленный?
Сравните запросы в разных папках и клиентах, проверьте журналы, задержку диска и активную конфигурацию. Если задержка только в веб-почте, проверьте и её сторону.
Источники
- Dovecot: Mail Cache Settings — Как Dovecot кэширует поля писем и какие параметры управляют начальным кэшированием. URL: https://doc.dovecot.org/2.3/configuration_manual/mail_cache_settings/
- Dovecot: Maildir Configuration — Назначение maildir_stat_dirs и его влияние на вызовы stat() в Maildir. URL: https://doc.dovecot.org/2.3/configuration_manual/mail_location/Maildir/
- Dovecot: dbox Mailbox Format — Различия sdbox и mdbox, устройство хранения и предупреждение о сохранности индексов. URL: https://doc.dovecot.org/2.3/admin_manual/mailbox_formats/dbox/
- Dovecot: doveadm-sync — Официальный порядок синхронизации и конвертации ящиков, в том числе в mdbox. URL: https://doc.dovecot.org/main/core/man/doveadm-sync.1.html



