Индексы загружаются при запуске

В этой статье мы обсуждаем, как индексы загружаются при запуске и последствия для входящих запросов и управления экземпляром поиска.

В старых версиях Sphinx, если была установлена опция preopen, индексы предварительно читались и загружались в память. В это время демон отказывался принимать любые входящие соединения. Если для небольших индексов это не было большой проблемой, так как они загружались быстро. Но для огромного индекса, который требовал загрузки десятков или даже сотен ГБ, это была настоящая проблема, так как загрузка могла занять несколько минут или больше.

В Sphinx 2.3 это изменилось, так как файлы индексов отображаются в памяти (с помощью mmap), а не просто читаются и загружаются в память. С помощью mmap, теневой поток демона, а не основной, сначала считывает один байт для каждой страницы, а затем продолжает считывать остальные данные, медленно загружая все в ОЗУ, но также позволяя доступ к данным. Короче говоря, это ленивое загрузка файлов индексов.

Таким образом, демон может принимать соединения, как только он запущен. Если запросу нужно получить доступ к некоторым случайным данным, которые еще не загружены в память, он будет считывать их с диска. Это также означает, что запрос может выполняться медленнее, чем обычно (в зависимости от производительности хранилища), но, по крайней мере, демон может предоставить результаты. Более того, как только файлы индекса загружены, демон может предложить 'полную скорость' для него, даже если другие индексы все еще загружаются.

Хотя это хорошие новости для большинства пользователей, для некоторых 'ленивая' загрузка может быть не лучшей. Например, балансировщик нагрузки, использующий простые стратегии (случайный или круговой), которые не измеряют время отклика, добавит перезапущенный экземпляр, как только демон будет запущен. Поскольку запросы будут требовать чтения непосредственно с диска, экземпляр будет предоставлять более высокое или значительно более высокое время отклика, чем обычно, что нежелательно. Вместо этого было бы лучше, если это возможно, чтобы экземпляр добавлялся в кластер только после того, как демон закончит загрузку индексов.

Чтобы покрыть эту ситуацию, с версии 2.3 существует опция для searchd , но, к сожалению, она была недокументирована до недавнего времени: '--force-preread'. Используя эту опцию, демон все равно будет mmap файлы индексов, но предварительное чтение будет блокирующей операцией (так же, как в старых версиях), и searchd не будет отвечать, пока все не будет загружено в память.

Установить Manticore Search

Установить Manticore Search