У моей компании есть несколько серверов, которые мы выделяем для запуска Sphinx Search. Все это CentOS 5 с около 48 ГБ памяти, а наша версия searchd - 1.11. Недавно я пытался понять, почему Sphinx использует так мало доступной памяти для своих обычных индексов (пока мы не используем индексы RT). По данным официального сайта Sphinx, все файлы, относящиеся к индексу, за исключением файлов .spd и .spp, хранятся в ОЗУ. В настоящее время это составляет около 14 ГБ для всех наших индексов, которые легко помещаются в ОЗУ. Однако, когда я обращаюсь к htop по поводу использования памяти, он показывает, что используется чуть меньше 1,5 ГБ! Интересно, что он сообщает, что также используется своп, даже если для vm.swappiness установлено значение 0. Если я остановлю searchd, своп упадет до 0. (Следует отметить, что объем используемого свопа не превышает сумму используемой памяти.) Мы настроили его так, чтобы все наши индексы открывались заранее при запуске (preopen_indexes = 1 в нашем sphinx conf).
Учитывая вышеизложенную информацию, у меня есть два вопроса:
попробуйте mlock = 1 и переиндексируйте все индексы.
index index1
{
source = main1
path = /ssd/sphinx/index.main
charset_type = utf-8
docinfo = extern
mlock = 1
}
Что делает Sphinx с данными в этих индексах, если он не хранит их в памяти?
Вероятно, это действительно помещает их в память. Но ОС хоста замечает, что они мало используются, и меняет их.
Предлагаю посмотреть, чтобы убедиться, что ваша подкачка действительно применяется.
Можно ли заставить Sphinx хранить больше данных в памяти?
Если у вас есть свободная память. Поместите индексы на RAM-диск :)
А если у вас действительно достаточно свободной памяти, вместо этого полностью отключите подкачку. Вы рискуете получить сбой, если закончится память, но это не похоже на то, чтобы произойти на этом сервере.