我通过比较Tokumx和纯Mongodb来进行读取性能压力测试。
tokumx和mongodb都在同一台机器上运行。
硬件概述:
Model Name: Mac mini
Model Identifier: Macmini6,1
Processor Name: Intel Core i5
Processor Speed: 2.5 GHz
Number of Processors: 1
Total Number of Cores: 2
L2 Cache (per Core): 256 KB
L3 Cache: 3 MB
Memory: 10 GB
每个实例中只有一个集合。每个集合中有100,000个条目。
对于tokumx,它是作为分区集合创建的。但是对于mongodb来说,它是作为一个普通的集合创建的:
db.createCollection("sample", {partitioned: true, primaryKey: {field1:1, _id: 1}});
对于这两个实例,索引如下所示:
db.sample.ensureIndex({field1:1});
db.sample.ensureIndex({field2:1});
db.sample.ensureIndex({field3:1});
db.sample.ensureIndex({field4:1});
db.sample.ensureIndex({geo:"2d"});
db.sample.ensureIndex({"created_at":1});
我正在使用Tsung进行压力测试。
在测试计划中,我通过按field2
desc查看geo
和created_at
字段来进行简单搜索。
<clients>
<client host="localhost" use_controller_vm="false" maxusers="8000"/>
</clients>
<servers>
<server host="jchimac.thenetcircle.lab" port="8080" type="tcp"/>
</servers>
<load duration="5" unit="minute">
<arrivalphase phase="1" duration="5" unit="minute">
<users interarrival="0.03" unit="second"/>
</arrivalphase>
</load>
根据官方文件,交易应该像TOKUMX™ BENCHMARK VS. MONGODB – HDD
但在我的测试中:
TOKUMX:
MongoDB的:
我在这里要求知道是否有人可以对此提出任何暗示?我在整个测试中是否遗漏了什么?
更新
我在Linux(CentOS)机器上进行了另一轮测试:
CentOS release 6.5 (Final)
2.6.32-504.1.3.el6.x86_64 GNU/Linux
MemTotal: 24589896 kB
CPU: 12* (Intel(R) Xeon(R) CPU E5645 @ 2.40GHz)
示例数据如下所示:
{
"_id": ObjectId("54867dc8ffbc15aa2bc3ee0e"),
"_iid": 15,
"_pid": 15,
"uid": 102296,
"nickname": "nickname_102296",
"gender": 3,
"image_id": 15,
"created_at": 1418100168,
"tag": 1,
"geo": {
"lat": 51.590449999999997033,
"lon": 6.9671900000000004383
}
}
每个系列都有1,000,000个条目。
每个集合上的索引(正常集合已创建):
db.createCollection("coll", {primaryKey: {_pid:1, _id: 1}});
db.tokumx_coll.ensureIndex({gender:1});
db.tokumx_coll.ensureIndex({uid:1});
db.tokumx_coll.ensureIndex({geo:"2d"});
db.tokumx_coll.ensureIndex({_pid:1});
db.tokumx_coll.ensureIndex({_iid:1});
db.tokumx_coll.ensureIndex({"created_at":1});
测试计划也很简单:
{'$query', {gender,3,geo, {'$geoWithin', {'$center', [[48.72761, 9.24596], 0.005]}}}, '$orderby',{'_pid',-1}}
Tsung压力测试每次测试运行1小时。并发性是每秒1个请求。
<load>
<arrivalphase phase="1" duration="60" unit="minute">
<users interarrival="1" unit="second"/>
</arrivalphase>
</load>
以下是屏幕截图中的报告:
TOKUMX:
MongoDB的:
更新@ 2014.12.12 发现这个: https://github.com/Tokutek/mongo/issues/1014
答案 0 :(得分:3)
TokuMX 2.0.0 Community Edition仍然建立在MongoDB 2.4上,当我发布这篇帖子时,它还没有GEO 2dsphere索引。因此,如果您正在使用具有GEO索引的Compound Indexes,则必须等待支持geo 2dshere索引的MongoDB 2.6的版本库。
基本上:
如果您对我的压力测试感兴趣,可以在post找到它。
答案 1 :(得分:2)
Sysbench事务包括插入/更新/删除操作,但您描述的测试是只读的。 TokuMX实现比MongoDB高得多的Sysbench结果的一个重要原因是写并发。
答案 2 :(得分:2)
我很高兴看到你对TokuMX感兴趣。但是,在尝试从结果中得出结论之前,您应该回答一些关于基准设置的问题:
您正在Mac mini上运行。 TokuMX仅支持在OSX上进行开发,而不支持生产。我们已经在Linux上解决了OSX上的几个显式性能问题。如果您有兴趣评估TokuMX的性能,那么您真的应该在Linux上使用专用硬件进行测试。
您从我们的营销材料中显示的图表描述了特定基准测试(sysbench)的吞吐量如何随着我们改变并发线程的数量而变化。 Tsung似乎没有测量吞吐量与并发性,所以为什么你期望它与我们网站上的图表有类似的特征?
Tsung的工作量是否与您的申请相似?你是如何选择你测试的架构的?它代表了您的应用程序的数据模型吗?您的查询与您选择的索引不匹配;如果要在field2, geo, created_at
上测试查询,那么您应该有一个根据该密钥对数据进行排序的索引。我希望您的应用程序不仅仅是一个只读工作负载,它不会使用您在小型数据集上定义的任何索引。更多地考虑如何设计代表您的应用程序的基准。或者更好的是,只需运行您的应用程序或跟踪它,并监控您关注的指标。
您的基准测试运行时间仅为5分钟,并且大部分输出在运行中表现出明显的差异。如果您对此工作负载感兴趣,您可能希望将其运行更长时间(并且可能在更大的数据集上),收集大量数据,并比较TokuMX和MongoDB之间的吞吐量和延迟直方图。
为什么要创建分区集合?你有没有创建任何分区?这个范例是否符合您的申请要求?
我认为,如果您开始解决这些问题,您将引导自己走向您所看到的差异,并且您将有望接近一个能够为您提供可靠且可操作的结果的基准。