Здесь мы тестировали производительность Sphinx 3.0.2 против Manticore 2.6.2. Это было 8 месяцев назад, и с тех пор и Manticore, и Sphinx изменились. Как сказано в объявлении Sphinx 3.0.3 , Sphinx 3.0.3 в два раза быстрее по сравнению с 3.0.2, поэтому интересно провести еще один бенчмарк. На этот раз давайте протестируем на реальном наборе данных - комментариях Hacker News.
Бенчмарк был проведен при следующих условиях:
- Курированный набор данных комментариев Hacker News 2016 года в формате CSV
- ОС: 16.04.4 LTS (Xenial Xerus), ядро: 4.15.0-30-generic
- CPU: Intel(R) Xeon(R) CPU E3-1275 v5 @ 3.60GHz, 8 ядер
- 64G ОЗУ
- HDD
- Docker версия 17.05.0-ce, сборка 89658be
- Базовый образ для индексации и searchd - alpine:3.6
- Manticore Search был собран там, двоичные файлы 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
}
Индексация
Индексация заняла 682 секунды для Manticore и 645 секунд для Sphinx:
Manticore:
indexing index 'full'...
collected 11654429 docs, 6198.6 MB
sorted 1115.7 Mhits, 100.0% done
total 11654429 docs, 6198580642 bytes
total <b>681.732 sec</b>, 9092389 bytes/sec, 17095.30 docs/sec
total 11676 reads, 1.811 sec, 452.6 kb/call avg, 0.1 msec/call avg
total 9431 writes, 4.878 sec, 1065.3 kb/call avg, 0.5 msec/call avg
Sphinx:
using config file '/root/manticore.conf'...
indexing index 'full'...
collected 11654429 docs, 6198.6 MB
sorted 1115.7 Mhits, 100.0% done
total 11654429 docs, 6.199 Gb
total <b>645.7 sec</b>, 9.600 Mb/sec, 18049 docs/sec
Итак, на этом наборе данных и схеме индекса Manticore индексирует медленнее Sphinx на 5,6%.
Тесты производительности
Оба экземпляра были прогреты перед тестированием. Индексы были одного размера и полностью находились в кэше ОС:
Manticore:
snikolaev@dev:~$ sudo ls -lah /var/lib/docker/volumes/4702617c7b0d970ba660514053706125fd88f2a4b7fce7222aab1f53fba2b56d/_data/
total 4.6G
drwx------ 2 root root 4.0K Jan 25 04:50 .
drwxr-xr-x 3 root root 4.0K Jan 25 04:43 ..
-rw-r--r-- 1 root root 362M Jan 25 03:51 idx_full.spa
-rw-r--r-- 1 root root 3.1G Jan 25 03:56 idx_full.spd
-rw-r--r-- 1 root root 27M Jan 25 03:56 idx_full.spe
-rw-r--r-- 1 root root 601 Jan 25 03:56 idx_full.sph
-rw-r--r-- 1 root root 6.3M Jan 25 03:56 idx_full.spi
-rw-r--r-- 1 root root 0 Jan 25 03:51 idx_full.spk
-rw------- 1 root root 0 Jan 25 04:50 idx_full.spl
-rw-r--r-- 1 root root 0 Jan 25 03:51 idx_full.spm
-rw-r--r-- 1 root root 1.1G Jan 25 03:56 idx_full.spp
-rw-r--r-- 1 root root 1 Jan 25 03:56 idx_full.sps
-rw-rw-r-- 1 root root 750 Jan 25 03:27 manticore.conf
lrwxrwxrwx 1 root root 11 Jan 25 03:57 query.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jan 25 03:57 searchd.log -> /dev/stdout
-rw------- 1 root root 2 Jan 25 04:50 searchd.pid
snikolaev@dev:~$ sudo vmtouch /var/lib/docker/volumes/4702617c7b0d970ba660514053706125fd88f2a4b7fce7222aab1f53fba2b56d/_data/
vmtouch: WARNING: not following symbolic link /var/lib/docker/volumes/4702617c7b0d970ba660514053706125fd88f2a4b7fce7222aab1f53fba2b56d/_data/searchd.log
vmtouch: WARNING: not following symbolic link /var/lib/docker/volumes/4702617c7b0d970ba660514053706125fd88f2a4b7fce7222aab1f53fba2b56d/_data/query.log
Files: 12
Directories: 1
Resident Pages: 1190485/1190682 4G/4G 100%
Elapsed: 0.070337 seconds
Sphinx:
snikolaev@dev:~$ sudo ls -lah /var/lib/docker/volumes/0aa7c89baeaa4c1bd2c52d2fbffe6f05fde5f43243534d5725482a702a90fd5b/_data
total 4.6G
drwx------ 3 root root 4.0K Jan 25 04:50 .
drwxr-xr-x 3 root root 4.0K Jan 25 04:43 ..
-rw-r--r-- 1 root root 362M Jan 25 03:37 idx_full.spa
-rw-r--r-- 1 root root 3.1G Jan 25 03:41 idx_full.spd
-rw-r--r-- 1 root root 27M Jan 25 03:41 idx_full.spe
-rw-r--r-- 1 root root 648 Jan 25 03:41 idx_full.sph
-rw-r--r-- 1 root root 6.3M Jan 25 03:41 idx_full.spi
-rw-r--r-- 1 root root 8 Jan 25 03:37 idx_full.spj
-rw-r--r-- 1 root root 1.4M Jan 25 03:37 idx_full.spk
-rw------- 1 root root 0 Jan 25 04:50 idx_full.spl
-rw-r--r-- 1 root root 1.1G Jan 25 03:41 idx_full.spp
-rw-rw-r-- 1 root root 750 Jan 25 03:27 manticore.conf
lrwxrwxrwx 1 root root 11 Jan 25 03:42 query.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jan 25 03:42 searchd.log -> /dev/stdout
-rw------- 1 root root 2 Jan 25 04:50 searchd.pid
drwxr-sr-x 8 root root 4.0K Jan 23 08:01 sphinx-3.1.1
snikolaev@dev:~$ sudo vmtouch /var/lib/docker/volumes/0aa7c89baeaa4c1bd2c52d2fbffe6f05fde5f43243534d5725482a702a90fd5b/_data
vmtouch: WARNING: not following symbolic link /var/lib/docker/volumes/0aa7c89baeaa4c1bd2c52d2fbffe6f05fde5f43243534d5725482a702a90fd5b/_data/searchd.log
vmtouch: WARNING: not following symbolic link /var/lib/docker/volumes/0aa7c89baeaa4c1bd2c52d2fbffe6f05fde5f43243534d5725482a702a90fd5b/_data/query.log
Files: 156
Directories: 18
Resident Pages: 1195648/1210212 4G/4G 98.8%
Elapsed: 0.075835 seconds
Тест 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
Результаты: 32,9 секунды для Sphinx и 28,1 секунды для Manticore. Итак, в этом тесте Manticore Search быстрее Sphinx Search на 16,7%.
Тест 2 - топ-1000 частых терминов из коллекции, разбитые по группам (топ 1-50, топ 50-100 и т.д.)
Теперь посмотрим, как Sphinx и Manticore различаются при обработке терминов из подгрупп группы топ-1000 частых терминов:
Manticore быстрее Sphinx на 24% по задержке 95-процентиля и на 21% по пропускной способности.
Тест 3 - топ-1000 частых терминов из коллекции, разбитые по группам + 1 термин из группы 1-100
Давайте проверим производительность пересечения наборов документов, добавив еще один частый термин к запросу:
Снова Manticore быстрее Sphinx на 21% по пропускной способности и на 13% в среднем по задержке 95-процентиля. Хотя для групп 900-950 и 950-1000 Sphinx показал немного лучшую задержку 95-процентиля - на 1,3% и 4,6% соответственно (но все еще хуже по пропускной способности - на 15% и 14% соответственно по сравнению с Manticore Search)
Тест 4 - топ-1000 частых терминов из коллекции, разбитые по группам + 1 термин из группы 1-100, оба термина заключены в кавычки для создания фразы
В среднем Manticore снова быстрее: на 20% по пропускной способности и на 11% по задержке 95-процентиля. Как и в предыдущем тесте, Sphinx показывает более низкую задержку 95-процентиля для групп 850-900, 900-950 и 950-1000 - на 1,4%, 4,9% и 4,9% соответственно, при этом пропускная способность все еще значительно ниже - на 14-15%.
Тест 5 - 2 термина каждый из группы 600-750 при различных уровнях параллельности
Этот тест направлен на то, чтобы показать разницу в пропускной способности при различных уровнях параллельности запросов. Вот что мы получили:
Таким образом, Manticore быстрее при всех уровнях параллельности в среднем на 14% и на 17% при параллельности 8, которая обеспечивает максимальную пропускную способность с задержкой 95-процентиля также на 17% ниже.
Выводы
Sphinx показывает немного лучшую производительность индексации.
С точки зрения производительности поиска Manticore 2.7.5 показывает значительно более высокую пропускную способность во всех тестах и значительно более низкую задержку в подавляющем большинстве тестов.
Тест полностью упакован в Docker и открыт в нашем github . Подробные результаты можно найти здесь . Мы будем благодарны, если вы проведете такие же тесты на вашем оборудовании или добавите другие тесты в набор и сообщите нам результаты.
Спасибо за чтение!