В этой статье мы обсудим, как индексы загружаются при запуске, и последствия для входящих запросов и управления экземпляром поиска.
В более старых версиях Sphinx, если был установлен параметр preopen, индексы предварительно считывались и загружались в память. В это время демон отказывался принимать какие-либо входящие подключения. Для небольших индексов это не было большой проблемой, так как они быстро загружались. Но для огромного индекса, который мог потребовать загрузки десятков или даже сотен ГБ, это было настоящей проблемой, так как загрузка могла занять несколько минут или даже больше.
В Sphinx 2.3 это изменилось, поскольку файлы индексов теперь отображаются в память (с помощью mmap), а не просто считываются и загружаются в память. С помощью mmap, побочный поток демона, а не основной, сначала считывает один байт для каждой страницы, а затем продолжает чтение остальных данных, постепенно загружая их в оперативную память, но при этом разрешая доступ к данным. Короче говоря, это ленивая загрузка файлов индексов.
Таким образом, демон может принимать подключения сразу после запуска. Если запросу нужно получить доступ к каким-либо случайным данным, которые еще не загружены в память, он будет считывать их с диска. Это также означает, что запрос может выполняться медленнее, чем обычно (в зависимости от производительности хранилища), но по крайней мере демон может предоставлять результаты. Более того, как только файлы индекса будут загружены, демон может предложить ‘полную скорость’ для него, даже если другие индексы все еще загружаются.
Хотя эти новости порадуют большинство пользователей, для некоторых ‘ленивая’ загрузка может быть не самым лучшим вариантом. Например, балансировщик нагрузки, использующий простые стратегии (случайную или круговую), которые не измеряют времена ответа, добавит перезагруженный экземпляр сразу после запуска демона. Поскольку запросы потребуют чтения напрямую с диска, экземпляр будет обеспечивать более высокое или значительно более высокое время ответа, чем обычно, что нежелательно. Вместо этого было бы лучше, если бы возможно, добавлять экземпляр в кластер только после завершения демоном загрузки индексов.
Для покрытия этой ситуации с версии 2.3 существует параметр для searchd , который, к сожалению, до недавнего времени был недокументирован: ‘–force-preread’. При использовании этого параметра демон по-прежнему будет отображать файлы индексов в память, но предварительное чтение будет блокирующей операцией (как в старых версиях), и searchd не будет откликаться, пока все не будет загружено в память.