在这里 我们对比了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秒用于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
结果是: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上开源 。详细结果可以在 这里 找到。如果您在您的硬件上运行相同的测试或向套件中添加不同的测试,我们将不胜感激,并请告知我们结果。
感谢您的阅读!