Manticore 2.7.5 vs Sphinx 3.1.1

在这里 我们对比了Sphinx 3.0.2和Manticore 2.6.2。这是8个月前的事情,Manticore和Sphinx自那时以来都有所变化。正如在 Sphinx 3.0.3公告 中所说,Sphinx 3.0.3的速度比3.0.2快了最多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 RAM
  • HDD
  • Docker版本17.05.0-ce,构建89658be
  • 索引和searchd的基础镜像 - alpine:3.6
  • 在此构建了Manticore Search,Sphinx二进制文件从网站下载,因为没有开源可供构建
  • 压力测试工具 用于基准测试

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秒用于Manticore645秒用于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

结果是:Sphinx需要32.9秒,**Manticore需要28.1秒。**因此在这个测试中,Manticore Search比Sphinx Search快16.7%。

测试2 - 按组划分的集合中前1000个频繁术语(前1-50,前50-100等)

现在让我们看看Sphinx和Manticore在处理前1000个频繁术语的子组时有何不同:


Manticore在95p延迟方面比Sphinx快24%,在吞吐量方面快21%。

测试3 - 按组划分的集合中前1000个频繁术语 + 1个来自组1-100的术语

通过向查询中添加一个更频繁的术语来测试文档集的交集性能:


再次,Manticore在吞吐量方面比Sphinx快21%,在95p延迟的平均值方面快13%。尽管对于组900-950和950-1000,Sphinx显示出稍微更好的95p延迟——分别为1.3%和4.6%(但吞吐量仍然比Manticore Search差15%和14%)。

测试4 - 按组划分的集合中前1000个频繁术语 + 1个来自组1-100的术语,两个术语用引号括起来以形成短语


平均而言,Manticore再次更快:吞吐量快20%,95p延迟快11%。与之前的测试一样,Sphinx在组850-900、900-950和950-1000的95p延迟方面显示出更低的延迟——分别为1.4%、4.9%和4.9%,但吞吐量仍然显著较低——低14-15%。

测试5 - 每组600-750中的2个术语在不同并发下

此测试旨在显示在不同查询并发下的吞吐量差异。我们得到的结果是:


因此,Manticore在所有并发下平均快14%,在并发8时快17%,这使得最大吞吐量的95p延迟也降低了17%。

结论

Sphinx显示出稍微更好的索引性能。

在搜索性能方面,Manticore 2.7.5在所有测试中显示出更高的吞吐量,并且在绝大多数测试中延迟更低。

该测试完全容器化,并且 在我们的github上开源 。详细结果可以在 这里 找到。如果您在您的硬件上运行相同的测试或向套件中添加不同的测试,我们将不胜感激,并请告知我们结果。

感谢您的阅读!

安装Manticore Search

安装Manticore Search