Недавно мы выпустили Manticore 3.0.0 с множеством улучшений, включая новые оптимизации, повышающие производительность . В этой статье мы хотим сравнить производительность новой версии с производительностью Sphinx 3.1.1.
TL;DR
Manticore показывает:
- примерно в 2 раза более высокую производительность поиска в некоторых случаях, особенно при более длинных запросах
- и ниже, но всё равно лучшую производительность во всех остальных тестах
- за исключением времени индексации, где Sphinx быстрее на 2%
Тестовое окружение
Как ранее, когда мы сравнивали 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
}
Индексация
Индексация заняла 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 %.
Тесты производительности
Оба экземпляра были прогреты перед тестированием. Файлы индексов были следующими:
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
Тест 1 — время обработки топ-1000 терминов из коллекции
Для начала просто проведём простой тест — сколько времени занимает поиск документов, содержащих топ-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 %.
Тест 2 — топ-1000 часто встречающихся терминов из коллекции, разбитых по группам (топ 1-50, топ 50-100 и т. д.)
Теперь посмотрим, чем отличаются Sphinx и Manticore при обработке терминов из подгрупп топ-1000 часто встречающихся терминов.
Чтобы лучше понять запросы, ниже приведены несколько случайных примеров запросов для каждой из групп:
| 1-50 | 50-100 | 100-150 | 150-200 | 200-250 | 250-300 |
| about | get | thing | used | different | high |
| my | work | am | off | system | build |
| more | things | seems | sure | didn | next |
| 300-350 | 350-400 | 400-450 | 450-500 | 500-550 | 550-600 |
| days | worth | 20 | wanted | price | itself |
| write | server | care | sites | g | file |
| nothing | phone | story | recently | model | store |
| 600-650 | 650-700 | 700-750 | 750-800 | 800-850 | 850-900 |
| hiring | smart | welcome | choice | taken | topic |
| client | wish | wants | pg | details | core |
| iphone | reasons | environment | generally | css | wondering |
| 900-950 | 950-1000 | ||||
| complete | keywords | ||||
| resources | late | ||||
| thoughts | 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 |
| more be | that been | way being | an off | just startup | had pay |
| them as | could other | can d | think own | really else | if design |
| about was | make then | was etc | from app | to little | on yet |
| 300-350 | 350-400 | 400-450 | 450-500 | 500-550 | 550-600 |
| just either | a internet | who net | you location | will program | t basically |
| not away | by social | t past | a sites | a several | has co |
| 1 write | has means | most guys | no matter | has space | if basically |
| 600-650 | 650-700 | 700-750 | 750-800 | 800-850 | 850-900 |
| way programmers | see title | because words | think mac | most expensive | time changed |
| was difficult | me successful | com customer | is heard | on extremely | been food |
| their weeks | than yc | because fine | also desktop | for understanding | most traffic |
| 900-950 | 950-1000 | ||||
| if party | really fairly | ||||
| when serious | here servers | ||||
| think speed | was lose |


Вау, Manticore быстрее Sphinx на 106% по пропускной способности и на 91,8% в среднем по задержке 95-го процентиля.
Тест 4 — топ-1000 часто встречающихся терминов из коллекции, разбитых по группам + 1 термин из группы 1-100, оба термина заключены в кавычки, чтобы образовать фразу
| 1-50 | 50-100 | 100-150 | 150-200 | 200-250 | 250-300 |
| "they all" | "think also" | "that code" | "we app" | "from give" | "by user" |
| "http you" | "like been" | "is our" | "as article" | "use made" | "really least" |
| "by some" | "use work" | "don well" | "i app" | "could different" | "if understand" |
| 300-350 | 350-400 | 400-450 | 450-500 | 500-550 | 550-600 |
| "other developer" | "by building" | "want create" | "there front" | "any government" | "them consider" |
| "has ideas" | "i python" | "who given" | "has completely" | "has price" | "ve starting" |
| "way facebook" | "be edit" | "up link" | "use location" | "really deal" | "now early" |
| 600-650 | 650-700 | 700-750 | 750-800 | 800-850 | 850-900 |
| "been weeks" | "up engineering" | "has asking" | "s p" | "who css" | "there plus" |
| "make api" | "we expect" | "really willing" | "t step" | "because strong" | "for traffic" |
| "was note" | "would themselves" | "http degree" | "http desktop" | "not otherwise" | "much food" |
| 900-950 | 950-1000 | ||||
| "s bring" | "very require" | ||||
| "this choose" | "all examples" | ||||
| "now bring" | "be argument" |


Здесь 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 терминов |
| job self release | using thanks second 12 | switch started b 12 places |
| every sites missing | around school model links | switch github class hate recent |
| his aren avoid | through jobs amount effect | switch facebook office absolutely english |


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


Пропускная способность — выше на 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

