最近 我们发布了 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 秒用于 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
结果是:Sphinx 需要 77.61 秒,Manticore 需要 71.46 秒。

因此在这个测试中,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 |
| 关于 | 获取 | 事物 | 使用 | 不同 | 高 |
| 我的 | 工作 | 是 | 关闭 | 系统 | 构建 |
| 更多 | 事情 | 似乎 | 确定 | 没 | 下一个 |
| 300-350 | 350-400 | 400-450 | 450-500 | 500-550 | 550-600 |
| 天 | 价值 | 20 | 想要 | 价格 | 本身 |
| 写 | 服务器 | 关心 | 网站 | g | 文件 |
| 没有 | 电话 | 故事 | 最近 | 模型 | 商店 |
| 600-650 | 650-700 | 700-750 | 750-800 | 800-850 | 850-900 |
| 招聘 | 聪明 | 欢迎 | 选择 | 已采取 | 主题 |
| 客户 | 愿望 | 想要 | pg | 细节 | 核心 |
| iphone | 原因 | 环境 | 通常 | css | 想知道 |
| 900-950 | 950-1000 | ||||
| 完整 | 关键词 | ||||
| 资源 | 晚 | ||||
| 想法 | ipad |


Manticore 比 Sphinx 快 6.8% 在延迟方面和 12.2% 在吞吐量方面。
测试 3 - 从集合中按组划分的前 1000 个频繁术语 + 组 1-100 中的 1 个术语
让我们看看当你有一个非常频繁的术语和另一个不太频繁的术语时它是如何工作的。示例是:
| 1-50 | 50-100 | 100-150 | 150-200 | 200-250 | 250-300 |
| 更多是 | 那已经 | 方式正在 | 一个关闭 | 只是初创 | 已经支付 |
| 他们作为 | 可以其他 | 可以d | 想自己 | 真的其他 | 如果设计 |
| 关于是 | 做然后 | 是等等 | 来自应用 | 到一点 | 在还 |
| 300-350 | 350-400 | 400-450 | 450-500 | 500-550 | 550-600 |
| 只是任一 | 一个互联网 | 谁网 | 你位置 | 将程序 | t 基本上 |
| 不远离 | 通过社交 | t 过去 | 一个网站 | 几个 | 有 co |
| 1 写 | 有意思 | 大多数家伙 | 无论如何 | 有空间 | 如果基本上 |
| 600-650 | 650-700 | 700-750 | 750-800 | 800-850 | 850-900 |
| 方式程序员 | 查看标题 | 因为单词 | 想 mac | 最贵 | 时间改变 |
| 是困难的 | 我成功 | com 客户 | 被听到 | 在极端 | 已经食物 |
| 他们的周 | 比 yc | 因为好 | 也桌面 | 为了理解 | 大多数流量 |
| 900-950 | 950-1000 | ||||
| 如果派对 | 真的相当 | ||||
| 当严肃 | 这里服务器 | ||||
| 想速度 | 是失去 |


哇,Manticore 在吞吐量上比 Sphinx 快 106%,在 95p 延迟方面平均快 91.8%。
测试 4 - 从集合中提取的前 1000 个频繁术语按组分解 + 来自组 1-100 的 1 个术语,两个术语用引号括起来以形成短语
| 1-50 | 50-100 | 100-150 | 150-200 | 200-250 | 250-300 |
| "他们都" | "也认为" | "那段代码" | "我们应用" | "从给予" | "由用户" |
| "http 你" | "像已经" | "是我们的" | "作为文章" | "使用制作" | "真的至少" |
| "由一些" | "使用工作" | "做得好" | "我应用" | "可以不同" | "如果理解" |
| 300-350 | 350-400 | 400-450 | 450-500 | 500-550 | 550-600 |
| "其他开发者" | "通过构建" | "想要创建" | "那里前面" | "任何政府" | "他们考虑" |
| "有想法" | "我 python" | "谁给予" | "已经完全" | "有价格" | "开始" |
| "方式 facebook" | "被编辑" | "上链接" | "使用位置" | "真的交易" | "现在早期" |
| 600-650 | 650-700 | 700-750 | 750-800 | 800-850 | 850-900 |
| "已经几周" | "上工程" | "已经询问" | "s p" | "谁 css" | "那里加" |
| "制作 api" | "我们期望" | "真的愿意" | "t 步骤" | "因为强大" | "为了流量" |
| "是注意" | "会自己" | "http 学位" | "http 桌面" | "不然" | "很多食物" |
| 900-950 | 950-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 索引格式。
如果您有任何问题、疑问或意见,请随时与我们联系:
- 在 twitter
- 发送电子邮件至 [email protected]
- 在我们的 论坛 上发帖
- 在我们的 社区 Slack 中与我们聊天
- 在我们的 GitHub 问题跟踪器 上抱怨一切有多糟糕