Недавно мы выпустили Manticore 3.0.0 с множеством улучшений, включая новые оптимизации, повышающие производительность. В этой статье мы хотим сравнить производительность новой версии с производительностью Sphinx 3.1.1.
TL;DR
Manticore показывает:
- примерно в 2 раза более высокую производительность поиска в некоторых случаях, особенно при более длинных запросах
- и ниже, но все равно лучшую производительность во всех остальных тестах
- за исключением времени индексации, где Sphinx быстрее на 2%
Test environment
Как ранее, когда мы сравнивали Manticore 2.7 и Sphinx 3 , мы проведём бенчмарк на наборе данных из 11,6 млн пользовательских комментариев Hacker News.
Бенчмарк был проведён при следующих условиях:
- Набор отобранных комментариев Hacker News 2016 года в формате CSV
- ОС: Ubuntu 18.04.1 LTS (Bionic Beaver), ядро: 4.15.0-47-generic
- CPU: Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz, 8 ядер
- 32 ГБ ОЗУ
- HDD
- Docker версии 18.09.2
- Базовый образ для индексации и searchd — Ubuntu:bionic
- Manticore Search был собран в Docker, бинарники Sphinx были загружены с сайта, так как нет открытого исходного кода для сборки
- stress-tester для бенчмаркинга
Конфигурация идентична для Manticore и Sphinx:
source full
{
type = csvpipe
csvpipe_command = cat /root/hacker_news_comments.prepared.csv|grep -v line_number
csvpipe_attr_uint = story_id
csvpipe_attr_timestamp = story_time
csvpipe_field = story_text
csvpipe_field = story_author
csvpipe_attr_uint = comment_id
csvpipe_field = comment_text
csvpipe_field = comment_author
csvpipe_attr_uint = comment_ranking
csvpipe_attr_uint = author_comment_count
csvpipe_attr_uint = story_comment_count
}
index full
{
path = /root/idx_full
source = full
html_strip = 1
mlock = 1
}
searchd
{
listen = 9306:mysql41
query_log = /root/query.log
log = /root/searchd.log
pid_file = /root/searchd.pid
binlog_path =
qcache_max_bytes = 0
}
Indexation
Индексация заняла 1263 секунды для Manticore и 1237 секунды для Sphinx:
Manticore:
indexing index 'full'...
collected 11654429 docs, 6198.6 MB
creating lookup: 11654.4 Kdocs, 100.0% done
creating histograms: 11654.4 Kdocs, 100.0% done
sorted 1115.7 Mhits, 100.0% done
total 11654429 docs, 6198580642 bytes
total <b>1263.497 sec</b>, 4905890 bytes/sec, 9223.94 docs/sec
total 22924 reads, 1.484 sec, 238.4 kb/call avg, 0.0 msec/call avg
total 11687 writes, 11.773 sec, 855.1 kb/call avg, 1.0 msec/call avg
Sphinx:
indexing index 'full'...
collected 11654429 docs, 6198.6 MB
sorted 1115.7 Mhits, 100.0% done
total 11654429 docs, 6.199 Gb
total <b>1236.9</b> sec, 5.011 Mb/sec, 9422 docs/sec
Таким образом, на этом наборе данных и схеме индекса Manticore индексирует медленнее, чем Sphinx, примерно на 2 %.
Performance tests
Обе инстанции были прогреты перед тестированием. Файлы индексов были следующими:
Manticore:
root@bench# ls -lah /var/lib/docker/volumes/64746c338de981014c7c1ea93d4c55f55e13de63ac9e49c2d31292bb239a82b6/_data
total 4.7G
drwx------ 2 root root 4.0K May 14 09:03 .
drwxr-xr-x 3 root root 4.0K May 14 09:01 ..
-rw-r--r-- 1 root root 362M May 13 17:22 idx_full.spa
-rw-r--r-- 1 root root 3.1G May 13 17:31 idx_full.spd
-rw-r--r-- 1 root root 90M May 13 17:31 idx_full.spe
-rw-r--r-- 1 root root 628 May 13 17:31 idx_full.sph
-rw-r--r-- 1 root root 29K May 13 17:22 idx_full.sphi
-rw-r--r-- 1 root root 6.5M May 13 17:31 idx_full.spi
-rw------- 1 root root 0 May 14 09:03 idx_full.spl
-rw-r--r-- 1 root root 1.4M May 13 17:22 idx_full.spm
-rw-r--r-- 1 root root 1.1G May 13 17:31 idx_full.spp
-rw-r--r-- 1 root root 59M May 13 17:22 idx_full.spt
Sphinx:
root@bench /var/lib/docker/volumes # ls -lah /var/lib/docker/volumes/bd28586b5102ff91d4c367f612e2f7b1fe0a066917c8e0b4636d203dd3ba5b0b/_data
total 4.6G
drwx------ 3 root root 4.0K May 14 09:04 .
drwxr-xr-x 3 root root 4.0K May 14 09:03 ..
-rw-r--r-- 1 root root 362M May 13 19:09 idx_full.spa
-rw-r--r-- 1 root root 3.1G May 13 19:17 idx_full.spd
-rw-r--r-- 1 root root 27M May 13 19:17 idx_full.spe
-rw-r--r-- 1 root root 648 May 13 19:17 idx_full.sph
-rw-r--r-- 1 root root 6.3M May 13 19:17 idx_full.spi
-rw-r--r-- 1 root root 8 May 13 19:09 idx_full.spj
-rw-r--r-- 1 root root 1.4M May 13 19:09 idx_full.spk
-rw------- 1 root root 0 May 14 09:04 idx_full.spl
-rw-r--r-- 1 root root 1.1G May 13 19:17 idx_full.spp
Test 1 - time to process top 1000 terms from the collection
Для начала просто проведём простой тест — сколько времени занимает поиск документов, содержащих топ‑1000 терминов из коллекции:
for n in `head -1000 hn_top.txt|awk '{print $1}'`; do
mysql -P9306 -hhn_$engine -e "select * from full where match('@(comment_text,story_text,comment_author,story_author) $n') limit 10 option max_matches=1000" > /dev/null
done
Результаты: 77,61 секунды для Sphinx и 71,46 секунды для Manticore.

Таким образом, в этом тесте Manticore Search быстрее, чем Sphinx Search, на 8,59 %.
Test 2 - top 1000 frequent terms from the collection broken down by groups (top 1-50, top 50-100 etc.)
Теперь посмотрим, чем отличаются Sphinx и Manticore при обработке терминов из подгрупп топ‑1000 часто встречающихся терминов.
Чтобы лучше понять запросы, ниже приведены несколько случайных примеров запросов для каждой из групп:
| 1-50 | 50-100 | 100-150 | 150-200 | 200-250 | 250-300 |
| о | получить | вещь | использовано | разный | высокий |
| мой | работа | я | выключено | система | строить |
| больше | вещи | кажется | уверен | не | следующий |
| 300-350 | 350-400 | 400-450 | 450-500 | 500-550 | 550-600 |
| дни | ценность | 20 | хотел | цена | сам |
| писать | сервер | забота | сайты | g | файл |
| ничего | телефон | история | недавно | модель | магазин |
| 600-650 | 650-700 | 700-750 | 750-800 | 800-850 | 850-900 |
| наём | умный | приветствие | выбор | взятый | тема |
| клиент | желание | хочет | pg | детали | ядро |
| айфон | причины | окружение | в целом | css | интересоваться |
| 900-950 | 950-1000 | ||||
| полный | ключевые слова | ||||
| ресурсы | поздно | ||||
| мысли | ipad |


Manticore быстрее, чем Sphinx, на 6,8% по задержке 95p и на 12.2% по пропускной способности.
Тест 3 - 1000 самых частотных терминов из коллекции, разбитых по группам + 1 термин из группы 1-100
Посмотрим, как это работает, когда у вас есть один очень частый
| 1-50 | 50-100 | 100-150 | 150-200 | 200-250 | 250-300 |
| больше быть | то было | путь быть | один выключен | просто запуск | имел оплату |
| их как | мог бы другой | может d | думать свой | действительно иначе | если дизайн |
| о было | сделать тогда | было и т.д. | из приложения | к мало | на еще |
| 300-350 | 350-400 | 400-450 | 450-500 | 500-550 | 550-600 |
| просто либо | интернет | кто сеть | ваше местоположение | будет программа | t в основном |
| не далеко | по социальному | t прошлое | сайты | несколько | имеет со |
| 1 написать | имеет средства | большинство парней | не важно | имеет пространство | если в основном |
| 600-650 | 650-700 | 700-750 | 750-800 | 800-850 | 850-900 |
| путь программистов | см. заголовок | потому что слова | думать mac | самый дорогой | время изменилось |
| было трудно | я успешный | ком клиент | слышно | на чрезвычайно | было еда |
| их недели | чем yc | потому что хорошо | также настольный | для понимания | большой трафик |
| 900-950 | 950-1000 | ||||
| если вечеринка | действительно справедливо | ||||
| когда серьезно | здесь серверы | ||||
| думать скорость | было потеряно |


Вау, Manticore быстрее Sphinx на 106% по пропускной способности и на 91,8% в среднем по задержке 95‑го процента.
Тест 4 — 1000 самых частотных терминов из коллекции, разбитых по группам + 1 термин из группы 1‑100, оба термина заключены в кавычки, чтобы образовать фразу
| 1-50 | 50-100 | 100-150 | 150-200 | 200-250 | 250-300 |
| "они все" | "думать также" | "тот код" | "мы приложение" | "от дать" | "по пользователю" |
| "http вы" | "нравится был" | "это наш" | "как статья" | "использовать сделано" | "действительно минимум" |
| "кем-то" | "использовать работу" | "делать хорошо" | "я приложение" | "мог бы другой" | "если понять" |
| 300-350 | 350-400 | 400-450 | 450-500 | 500-550 | 550-600 |
| "другой разработчик" | "путем построения" | "хотеть создать" | "там фронт" | "любое правительство" | "их учитывать" |
| "имеет идеи" | "я python" | "кто дал" | "полностью имеет" | "имеет цену" | "начинаем" |
| "путь facebook" | "быть редактировать" | "вверх ссылка" | "использовать местоположение" | "действительно иметь дело" | "сейчас рано" |
| 600-650 | 650-700 | 700-750 | 750-800 | 800-850 | 850-900 |
| "были недели" | "в инженерии" | "имеет запрос" | "s p" | "кто css" | "там плюс" |
| "создать api" | "мы ожидаем" | "действительно желающий" | "t шаг" | "потому что сильный" | "для трафика" |
| "было примечание" | "были бы сами" | "http степень" | "http рабочий стол" | "не иначе" | "много еды" |
| 900-950 | 950-1000 | ||||
| "s приносит" | "очень требуется" | ||||
| "это выбирает" | "все примеры" | ||||
| "теперь приносит" | "быть аргументом" |


Здесь Manticore в среднем быстрее: на 11,8% по пропускной способности и на 21,2% по задержке 95p.
Тест 5 - 2 термина из группы 600-750 при разных уровнях одновременности
Этот тест направлен на демонстрацию разницы в пропускной способности при разных уровнях одновременности запросов. Вот что мы получили:


Manticore быстрее при всех уровнях одновременности в среднем на 31% и обеспечивает пропускную способность с задержкой 95p ниже на 28%.
Тест 6 - 3-5 терминов из разных групп
Этот тест направлен на демонстрацию разницы в поиске с более длинными запросами (3-5 терминов):
- 3 термина из групп 100-200, 400-500, 800-900 соответственно
- 4 термина из групп 100-200, 300-400, 500-600, 800-900 соответственно
- 5 терминов из групп 100-200, 300-400, 500-600, 800-900, 900-1000 соответственно
Примеры запросов:
| 3 термина | 4 термина | 5 терминов |
| работа сам выпуск | используя благодарности второй 12 | переключить начато b 12 мест |
| каждый сайт отсутствует | вокруг школьных моделей ссылки | переключить github класс ненавидеть недавний |
| его aren избегать | через количество работ эффект | переключить facebook офис абсолютно английский |


Пропускная способность Manticore выше на 77,6%, а задержка 95‑го процентиля ниже на 81,4%.
ТЕСТ 7: 3 И термина из групп 300‑600 и 1 НЕ из 300‑400
В этом тесте мы добавляем термин NOT к запросу из 3‑х терминов:


Пропускная способность - выше на 66,6%, задержка 95‑го процентиля - ниже на 57%.
Выводы
Sphinx показывает на несколько секунд лучшую производительность индексации при 21‑минутной индексации.
Что касается производительности поиска, которая, как мы считаем, гораздо важнее, Manticore 3.0.0 демонстрирует значительно более высокую пропускную способность и более низкую задержку во всех тестах. Весь тест полностью контейнеризован и
открыт в нашем github
. Подробные результаты можно найти
здесь
. Мы будем признательны, если вы запустите те же тесты на вашем оборудовании или добавите другие тесты в набор и сообщите нам результаты.
Если вы планируете мигрировать на Manticore 3, пожалуйста, прочитайте эту статью . Мы понимаем, что ваши индексы могут быть большими, и чтобы облегчить процесс миграции, существует новый инструмент index_converter , который может легко конвертировать ваши существующие индексы Sphinx 2 / Manticore 2 в новый формат индексов Manticore 3.
Если у вас возникнут какие‑либо проблемы, вопросы или комментарии, пожалуйста, свяжитесь с нами:
- в twitter
- отправив письмо на [email protected]
- разместив сообщение на нашем Форуме
- пообщавшись с нами в нашем Community Slack
- жалуясь на то, насколько всё плохо, в нашем трекер ошибок в GitHub