基准测试:Manticore 3 vs Sphinx 3 - 现在更快了

最近 我们发布了 Manticore 3.0.0 ,包含许多改进,包括一些新的优化,提升了性能。在本文中,我们想将新版本的性能与 Sphinx 3.1.1 的性能进行比较。

TL;DR

Manticore 显示:

  • 在某些情况下,搜索性能提高约 2 倍,特别是在较长查询时
  • 以及较低,但在所有其他测试中仍然表现更好
  • 除了索引时间,Sphinx 快 2%

测试环境

正如 之前我们对 Manticore 2.7 vs Sphinx 3 进行基准测试时 一样,我们将在 Hacker News 的 1160 万用户评论数据集上进行基准测试。

基准测试是在以下条件下进行的:

  • 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 核心
  • 32G RAM
  • HDD
  • Docker 版本 18.09.2
  • 索引和 searchd 的基础镜像 - Ubuntu:bionic
  • Manticore Search 在 docker 中构建,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
}

索引

索引耗时 1263 秒用于 Manticore1237 秒用于 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

结果是:Sphinx 需要 77.61 秒,Manticore 需要 71.46 秒。

因此在这个测试中,Manticore Search 比 Sphinx Search 快 8.59%。

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

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

为了更好地理解查询,这里是每个组的一些随机查询示例:

1-5050-100100-150150-200200-250250-300
关于获取事物使用不同
我的工作关闭系统构建
更多事情似乎确定下一个
300-350350-400400-450450-500500-550550-600
价值20想要价格本身
服务器关心网站g文件
没有电话故事最近模型商店
600-650650-700700-750750-800800-850850-900
招聘聪明欢迎选择已采取主题
客户愿望想要pg细节核心
iphone原因环境通常css想知道
900-950950-1000
完整关键词
资源
想法ipad


Manticore 比 Sphinx 快 6.8% 在延迟方面和 12.2% 在吞吐量方面。

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

让我们看看当你有一个非常频繁的术语和另一个不太频繁的术语时它是如何工作的。示例是:

1-5050-100100-150150-200200-250250-300
更多是那已经方式正在一个关闭只是初创已经支付
他们作为可以其他可以d想自己真的其他如果设计
关于是做然后是等等来自应用到一点在还
300-350350-400400-450450-500500-550550-600
只是任一一个互联网谁网你位置将程序t 基本上
不远离通过社交t 过去一个网站几个有 co
1 写有意思大多数家伙无论如何有空间如果基本上
600-650650-700700-750750-800800-850850-900
方式程序员查看标题因为单词想 mac最贵时间改变
是困难的我成功com 客户被听到在极端已经食物
他们的周比 yc因为好也桌面为了理解大多数流量
900-950950-1000
如果派对真的相当
当严肃这里服务器
想速度是失去


哇,Manticore 在吞吐量上比 Sphinx 快 106%,在 95p 延迟方面平均快 91.8%。

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

1-5050-100100-150150-200200-250250-300
"他们都""也认为""那段代码""我们应用""从给予""由用户"
"http 你""像已经""是我们的""作为文章""使用制作""真的至少"
"由一些""使用工作""做得好""我应用""可以不同""如果理解"
300-350350-400400-450450-500500-550550-600
"其他开发者""通过构建""想要创建""那里前面""任何政府""他们考虑"
"有想法""我 python""谁给予""已经完全""有价格""开始"
"方式 facebook""被编辑""上链接""使用位置""真的交易""现在早期"
600-650650-700700-750750-800800-850850-900
"已经几周""上工程""已经询问""s p""谁 css""那里加"
"制作 api""我们期望""真的愿意""t 步骤""因为强大""为了流量"
"是注意""会自己""http 学位""http 桌面""不然""很多食物"
900-950950-1000
"s 带来""非常需要"
"这个选择""所有例子"
"现在带来""是论点"


这里 Manticore 在平均上更快:吞吐量提高了 11.8%,95p 延迟降低了 21.2%。

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

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



在所有并发下,Manticore 的速度平均快 31%,并且吞吐量的 95p 延迟降低了 28%。

测试 6 - 来自不同组的 3-5 个术语

此测试旨在展示通过更长查询(3-5 个术语)进行搜索的差异:

  • 来自组 100-200 400-500 800-900 的 3 个术语
  • 来自组 100-200 300-400 500-600 800-900 的 4 个术语
  • 来自组 100-200 300-400 500-600 800-900 900-1000 的 5 个术语

查询示例:

3 个术语4 个术语5 个术语
工作 自我 发布使用 感谢 第二 12切换 开始 b 12 地方
每个 网站 缺失周围 学校 模型 链接切换 github 类别 讨厌 最近
他的避免通过工作量效果切换 facebook 办公室绝对英语


Manticore 的吞吐量高出 77.6%,而 95p 延迟低了 81.4%。

测试 7:来自 300-600 组的 3 个 AND 术语和 1 个 NOT 术语来自 300-400

在此测试中,我们向 3 术语查询添加了一个 NOT 术语:


吞吐量 - 高出 66.6%,95p 延迟 - 低了 57%。

结论

Sphinx 在 21 分钟的索引性能上表现出几秒钟的更好表现。
至于搜索性能,我们认为这更为重要,Manticore 3.0.0 在所有测试中表现出更高的吞吐量和更低的延迟。 整个测试完全容器化,并且 在我们的 GitHub 上开源 。详细结果可以在 这里 找到。如果您能在您的硬件上运行相同的测试或向套件添加不同的测试并告知我们结果,我们将不胜感激。

如果您考虑迁移到 Manticore 3,请阅读 这篇文章 。我们理解您的索引可能很大,为了简化迁移过程,有一个新的工具 index_converter ,可以轻松将您现有的 Sphinx 2 / Manticore 2 索引转换为新的 Manticore 3 索引格式。

如果您有任何问题、疑问或意见,请随时与我们联系:

安装Manticore Search

安装Manticore Search