Sphinx 3 против Manticore: производительность в сравнительном тесте

[ОБНОВЛЕНИЕ] Более свежий тест здесь .

Недавно долгожданный Sphinx 3 был выпущен и обновлён до 3.0.2 . Он получил возможности хранения документов, A-индексы, предварительную индексацию фрагментов и, к сожалению, больше не является открытым исходным кодом (по крайней мере, сейчас, в марте 2018 года).

Все это очень хорошие функции, но интересует ли вас, насколько они повлияли на производительность Sphinx 3 и насколько это отличается от производительности Manticore? Нас тоже!

Чтобы выяснить это, мы провели тест для измерения:

  • времени индексации
  • максимальной пропускной способности, которую Sphinx 3 и Manticore Search 2.6.2 могут предоставить
  • минимальной задержки, которую оба могут обеспечить

Тест основан на следующем:

  • luceneutil для генерации данных для индексации и наборов запросов
  • lucene2manticore для преобразования данных из Lucene в формат Manticore Search / Sphinx
  • stress-tester для бенчмаркинга
  • сервер: 8xIntel(R) Xeon(R) CPU E3-1275 v5 @ 3.60GHz, 64G RAM, HDD
  • ОС: Ubuntu 16.04.3 LTS, ядро 4.8.0-45-generic

Вот результаты:

ms_vs_s3_indexation

ms_vs_s3_throughputms_vs_s3_latencyКак видно, во всех испытанных сценариях Sphinx 3 имеет гораздо более длительное время индексации и гораздо худшую производительность: как по пропускной способности, так и по задержке. Мы склонны считать, что это может быть вызвано какой-то проблемой компиляции (снова, Sphinx 3 не является открытым исходным кодом, так что мы не можем перекомпилировать) или какой-то общей утечкой производительности, которую можно было бы отладить и исправить, если бы исходный код был доступен. Будет печально, если новые функции так сильно ухудшают производительность. Но в любом случае мы хотим предупредить всех пользователей Manticore и Sphinx, что вы можете столкнуться с ухудшением производительности, если решите перейти на Sphinx 3.

Пожалуйста, дайте нам знать, если у вас есть другие результаты перехода на Sphinx 3 или сравнения между Manticore и Sphinx 3, будет здорово выяснить, в каких случаях производительность не ухудшается.

Свяжитесь с нами, если вам нужна наша помощь.


Вот как вы можете воспроизвести тест

Имейте в виду, что загрузка и подготовка данных могут занять несколько часов.

  1. Установите вышеуказанные дополнительные инструменты и подготовьте конфигурации и файлы стоп-слов:
mkdir data
mkdir q

git clone http://github.com/mikemccand/luceneutil.git
git clone http://github.com/manticoresoftware/lucene2manticore
git clone http://github.com/Ivinco/stress-tester

cp lucene2manticore/*.conf ./
  1. Установите Manticore Search и бинарные файлы Sphinx3 .
  2. Загрузите и подготовьте исходные данные
cd luceneutil
python src/python/setup.py -download
cd ../data/
xzcat enwiki-20120502-lines-1k.txt.lzma > lucene.tsv

преобразуйте данные из формата TSV, похожего на Lucene, в правильный формат TSV, который можно использовать с источниками данных Manticore Search и Sphinx:

cd ..
python lucene2manticore/lucene2tsv.py data/lucene.tsv --maxlen 2097152 > data/lc.tsv
head -n 100000 data/lc.tsv >  data/lc100k.tsv
head -n 300000 data/lc.tsv > data/lc300k.tsv
head -n 1000000 data/lc.tsv > data/lc1m.tsv
  1. Подготовьте запросы
python lucene2manticore/lucene2query.py --types simple data/wikimedium500.tasks > q/q-wiki500-simple.txt
python lucene2manticore/lucene2query.py --types ext2 data/wikimedium500.tasks > q/q-wiki500-ext2.txt
python lucene2manticore/lucene2query.py --types simple luceneutil/tasks/wikimedium.10M.datefacets.nostopwords.tasks > q/q-wiki10m-simple.txt
python lucene2manticore/lucene2query.py --types ext2 luceneutil/tasks/wikimedium.10M.datefacets.nostopwords.tasks > q/q-wiki10m-ext2.txt
python lucene2manticore/lucene2query.py --types simple luceneutil/tasks/wikimedium.1M.nostopwords.tasks > q/q-wiki1m-simple.txt
python lucene2manticore/lucene2query.py --types ext2 luceneutil/tasks/wikimedium.1M.nostopwords.tasks > q/q-wiki1m-ext2.txt
cat q/q-wiki*-simple.txt > q/q-simple.txt
cat q/q-wiki*-ext2.txt > q/q-ext2.txt
  1. Подготовьте стоп-слова
indexer -c lucene2manticore/sphinx3.conf i2_1m_no_stopwords --buildstops stopwords1k.txt 1000
head -100 stopwords1k.txt > stopwords.txt
  1. Индексируйте данные и запомните, сколько это заняло:
./indexer -c lucene2manticore/manticore.conf --all
./indexer -c lucene2manticore/sphinx3.conf --all
  1. запустите демоны поиска
/path/to/manticore/searchd -c lucene2manticore/manticore.conf
/path/to/sphinx3/searchd -c lucene2manticore/sphinx3.conf
  1. разогрейте серверы

Перед тестированием желательно разогреть демон поиска, например, так:

cd stress-tester
for q in simple ext2; do for p in 8306 7406; do ./test.php --plugin=plain.php --data=../q/q-$q.txt -b=100 -c=8 --port=$p --index=i2_100k_stopwords_100 --maxmatches=100 --csv; done; done;

Тесты на пропускную способность

Теперь мы знаем, сколько времени занимает индексация (см. п. 4 выше). Давайте посмотрим, сколько пропускной способности может предоставить Sphinx 3 и Manticore Search.

Простые запросы к индексу из 100K документов с топ-100 стоп-словами:

for port in 7406 8306; do for c in 1 4 6 8 12; do for batchSize in 1 100; do ./test.php --plugin=plain.php --data=../q/q-simple.txt -b=$batchSize -c=$c --port=$port --index=i2_100k_stopwords_100 --maxmatches=1000 --csv; done; done; done

Простые запросы к индексу из 100K документов с топ-1000 стоп-словами:

for port in 7406 8306; do for c in 1 4 6 8 12; do for batchSize in 1 100; do ./test.php --plugin=plain.php --data=../q/q-simple.txt -b=$batchSize -c=$c --port=$port --index=i2_100k_stopwords_1k --maxmatches=1000 --csv; done; done; done

Сложные запросы к индексу 100K документов с 100 основными стоп-словами:

for port in 7406 8306; do for c in 1 4 6 8 12; do for batchSize in 1 100; do ./test.php --plugin=plain.php --data=../q/q-ext2.txt -b=$batchSize -c=$c --port=$port --index=i2_100k_stopwords_100 --maxmatches=1000 --csv; done; done; done

Сложные запросы к индексу 100K документов с 1000 основными стоп-словами:

for port in 7406 8306; do for c in 1 4 6 8 12; do for batchSize in 1 100; do ./test.php --plugin=plain.php --data=../q/q-ext2.txt -b=$batchSize -c=$c --port=$port --index=i2_100k_stopwords_1k --maxmatches=1000 --csv; done; done; done

Простые запросы к индексу 100K документов с 100 основными стоп-словами и включенной морфологией:

for port in 7406 8306; do for c in 1 8; do for batchSize in 1 100; do ./test.php --plugin=plain.php --data=../q/q-simple.txt -b=$batchSize -c=$c --port=$port --index=i2_100k_stopwords_100_morphology --maxmatches=1000 --csv; done; done; done

Простые запросы к индексу 1M документов с 100 основными стоп-словами:

for port in 7406 8306; do for c in 1 8; do for batchSize in 1 100; do ./test.php --plugin=plain.php --data=../q/q-simple.txt -b=$batchSize -c=$c --port=$port --index=i2_1m_stopwords_100 --maxmatches=1000 --csv; done; done; done

Сложные запросы к индексу 1M документов с 100 основными стоп-словами:

for port in 7406 8306; do for c in 1 8; do for batchSize in 1 100; do ./test.php --plugin=plain.php --data=../q/q-ext2.txt -b=$batchSize -c=$c --port=$port --index=i2_1m_stopwords_100 --maxmatches=1000 --csv; done; done; done

Простые запросы к индексу 1M документов с 100 основными стоп-словами и включенной морфологией:

for port in 7406 8306; do for c in 1 8; do for batchSize in 1 100; do ./test.php --plugin=plain.php --data=../q/q-simple.txt -b=$batchSize -c=$c --port=$port --index=i2_1m_stopwords_100_morphology --maxmatches=1000 --csv; done; done; done

Простые запросы к индексу 1M документов с 100 основными стоп-словами с фильтрацией по атрибутам, чтобы пропустить половину документов:

for port in 7406 8306; do for c in 1 8; do for batchSize in 1 100; do ./test.php --plugin=plain.php --data=../q/q-simple.txt -b=$batchSize -c=$c --port=$port --index=i2_1m_stopwords_100 --maxmatches=1000 --filter='ts<1199141654' --csv; done; done; done

Установить Manticore Search

Установить Manticore Search