Tokumx VS mongodb读取性能

时间:2014-12-08 13:44:55

标签: mongodb stress-testing tsung tokumx

我通过比较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查看geocreated_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

enter image description here

但在我的测试中:

TOKUMX:

enter image description here

enter image description here

MongoDB的:

enter image description here

enter image description here

我在这里要求知道是否有人可以对此提出任何暗示?我在整个测试中是否遗漏了什么?


更新

我在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:

tokumx summary
tokumx reports

MongoDB的:

mongodb summary mongodb reports


更新@ 2014.12.12 发现这个: https://github.com/Tokutek/mongo/issues/1014

3 个答案:

答案 0 :(得分:3)

对于MongoDB来说,

TokuMX 2.0.0 Community Edition仍然建立在MongoDB 2.4上,当我发布这篇帖子时,它还没有GEO 2dsphere索引。因此,如果您正在使用具有GEO索引的Compound Indexes,则必须等待支持geo 2dshere索引的MongoDB 2.6的版本库。

基本上:

  • &#34; 2d索引&#34;:复合索引只有一个附加字段,作为2d索引字段的后缀
  • &#34; 2dsphere索引&#34;:带有标量索引字段(即升序或降序)的复合索引作为2dsphere索引字段的前缀或后缀

如果您对我的压力测试感兴趣,可以在post找到它。

答案 1 :(得分:2)

Sysbench事务包括插入/更新/删除操作,但您描述的测试是只读的。 TokuMX实现比MongoDB高得多的Sysbench结果的一个重要原因是写并发。

答案 2 :(得分:2)

我很高兴看到你对TokuMX感兴趣。但是,在尝试从结果中得出结论之前,您应该回答一些关于基准设置的问题:

  1. 您正在Mac mini上运行。 TokuMX仅支持在OSX上进行开发,而不支持生产。我们已经在Linux上解决了OSX上的几个显式性能问题。如果您有兴趣评估TokuMX的性能,那么您真的应该在Linux上使用专用硬件进行测试。

  2. 您从我们的营销材料中显示的图表描述了特定基准测试(sysbench)的吞吐量如何随着我们改变并发线程的数量而变化。 Tsung似乎没有测量吞吐量与并发性,所以为什么你期望它与我们网站上的图表有类似的特征?

  3. Tsung的工作量是否与您的申请相似?你是如何选择你测试的架构的?它代表了您的应用程序的数据模型吗?您的查询与您选择的索引不匹配;如果要在field2, geo, created_at上测试查询,那么您应该有一个根据该密钥对数据进行排序的索引。我希望您的应用程序不仅仅是一个只读工作负载,它不会使用您在小型数据集上定义的任何索引。更多地考虑如何设计代表您的应用程序的基准。或者更好的是,只需运行您的应用程序或跟踪它,并监控您关注的指标。

  4. 您的基准测试运行时间仅为5分钟,并且大部分输出在运行中表现出明显的差异。如果您对此工作负载感兴趣,您可能希望将其运行更长时间(并且可能在更大的数据集上),收集大量数据,并比较TokuMX和MongoDB之间的吞吐量和延迟直方图。

  5. 为什么要创建分区集合?你有没有创建任何分区?这个范例是否符合您的申请要求?

  6. 我认为,如果您开始解决这些问题,您将引导自己走向您所看到的差异,并且您将有望接近一个能够为您提供可靠且可操作的结果的基准。