【问题标题】:How to speed up my mongodb test?如何加快我的 mongodb 测试?
【发布时间】:2012-03-08 15:37:43
【问题描述】:

根据我的测试,我每秒获得大约 500 次插入、200 次查询和 400 次更新。我想知道我可以调整什么来增加这些数字。

我看过其他人在他们的测试中可以实现数千甚至数万次插入,这比我的测试要好得多。我想知道我是否缺少一些基本的东西?

所以,这是事实:

  • 我正在使用默认配置的 win 32 位 mongodb v2.0.3
  • Java 驱动 (2.7.3) 和 spring mongo,(我不强制 fsync)
  • 结合插入和原子更新,如推送、拉取、 inc, dec, set,
  • 然后将所有这些重复 50 万次。
  • 目的是模拟插入和更新等用户操作
  • 没有定义特定的索引,但我认为默认情况下,id 上总会有唯一索引?
  • 在 Eclipse IDE 中运行的 java 应用程序与 mongod 服务器在同一台机器上运行
  • 硬件规格:Core i5、mem 4GB、thinkpad edge
  • 我注意到 java 进程大约需要 280MB,并且在循环过程中稳定在这个数字上

开始时间是:2012-03-0821:50:16

我使用 mongostat 进行监控,在达到22:05:10 的时间后,我终止了我未完成的应用程序..这是 mongostat 的最后一个输出

insert  query update delete getmore command flushes mapped  vsize    res faults locked % idx miss %     qr|qw   ar|aw  netIn netOut  conn       time
   499    200    400      0       0     100       0  1023m  1.06g   581m    145      8.5          0       0|0     0|0   645k    97k     3   22:05:01
   503    201    403      0       0     102       0  1023m  1.06g   582m    154     10.7          0       0|0     0|1   651k    98k     3   22:05:02
   520    208    415      0       0     105       0  1023m  1.06g   582m    176     11.1          0       0|0     0|0   671k   101k     3   22:05:03
   504    202    403      0       0     102       0  1023m  1.06g   582m    167      7.2          0       0|0     0|0   651k    98k     3   22:05:04
   524    209    419      0       0     106       0  1023m  1.06g   582m    147      8.3          0       0|0     0|0   675k   102k     3   22:05:05
   534    213    428      0       0     107       0  1023m  1.06g   583m    176      7.4          0       0|0     0|0   690k   103k     3   22:05:06
   531    213    424      0       0     108       0  1023m  1.06g   584m    160      4.9          0       0|0     0|0   685k   104k     3   22:05:07
   533    213    427      0       0     107       0  1023m  1.06g   584m    164      6.9          0       0|0     0|0   689k   103k     3   22:05:08
   518    208    414      0       0     105       0  1023m  1.06g   585m    158      7.3          0       0|0     0|0   669k   101k     3   22:05:09
   521    208    417      0       0     105       0  1023m  1.06g   585m    154      4.7          0       0|0     0|0   673k   101k     3   22:05:10

然后我检查了我的插入号码:

> db.myCollection.find().size();
90575

这是我插入的文档的示例,在此过程中也会更新等

> db.myCollection.findOne().pretty();
{
        "_id" : "b146189a-56a4-4035-8245-c4bd6dc2bd22",
        "something1" : "my class is cool !",
        "something2" : {
                "value" : "this is a statement blah blah",
                "name" : "myStatement"
        },
        "something3" : {
                "size" : {
                        "value" : 0,
                        "name" : "size"
                },
                "value" : [
                        "6810cb0c-fa3e-4ca9-8a27-8432f2d1e828",
                        "a8276d05-a796-4c43-bc74-edc06d074099"
                ],
                "name" : "myids"
        },
        "something4" : {
                "myattr" : {
                        "value" : "something",
                        "name" : "name"
                },
                "attr" : {
                        "content" : {
                                "value" : "another another body body content content",
                                "name" : "content"
                        },
                        "contentId" : "b146189a-56a4-4035-8245-c4bd6dc2bd22",
                        "name" : "something"
                },
                "subsubchildchild" : {
                        "size" : {
                                "value" : 0,
                                "name" : "size"
                        },
                        "value" : [ ],
                        "name" : "subBodies"
                },
                "myId" : "b146189a-56a4-4035-8245-c4bd6dc2bd22",
                "name" : "hiccups"
        },
        "something5" : {
                "value" : false,
                "name" : "hahaha"
        },
        "something6" : {
                "name" : "okay this is just a test"
        },
        "something7" : {
                "value" : false,
                "name" : "remove me !"
        },
        "something8" : {
                "size" : {
                        "value" : 0,
                        "name" : "size"
                },
                "value" : [ ],
                "name" : "guess what"
        },
        "something9" : {
                "size" : {
                        "value" : 0,
                        "name" : "anotherSize"
                },
                "value" : [ ],
                "name" : "tarantula"
        },
        "something10" : {
                "value" : 8,
                "name" : "my exam score"
        },
        "something11" : {
                "size" : {
                        "value" : 0,
                        "name" : "justAnotherSize"
                },
                "value" : [ ],
                "name" : "myReference"
        },
        "something12" : {
                "size" : {
                        "value" : 0,
                        "name" : "size"
                },
                "value" : [ ],
                "name" : "myOtherReference"
        },
        "something13" : {
                "value" : "8b78fff0-50f5-4992-9972-89f9d944fee7",
                "name" : "user"
        },
        "something14" : {
                "dateTime" : "2012-03-08 21:50:17.480000000"
        },
        "something15" : {
                "value" : false,
                "name" : "lovely"
        }
}

这是我的数据库统计数据:

> db.stats();
{
        "db" : "qa",
        "collections" : 7,
        "objects" : 815197,
        "avgObjSize" : 622.2093211824872,
        "dataSize" : 507223172,
        "storageSize" : 610770944,
        "numExtents" : 57,
        "indexes" : 5,
        "indexSize" : 64197952,
        "fileSize" : 1056702464,
        "nsSizeMB" : 16,
        "ok" : 1
}

还有一个好奇的问题..从我的主要收藏大小(大约有 90k 条记录)和其他不应该很大的非实质性收藏来看,在这种情况下拥有大约 1TB 的文件大小是否合理?我可以做些什么来帮助减少文件大小?

请分享你的想法。

【问题讨论】:

  • 我投票决定关闭,因为这似乎不是一个具体的问题。文件大小问题确实有一些优点,我建议拆分成一个单独的问题。
  • @Sean Reilly:很抱歉我提供太多信息的坏习惯以及我的问题不够清晰,但您介意检查一下我的更改吗?与许多其他类似的问题相比,希望这个问题现在更清楚了。
  • 我认为这实际上是一个相对明确的问题,虽然有点冗长;)

标签: java mongodb spring-data


【解决方案1】:

您似乎在mongostat 上遇到了很多问题。知道为什么吗?

结合插入和原子更新,例如 push、pull、inc、dec、set

您如何发布这些更新? _id?

我看过其他人在他们的测试中可以实现数千甚至数万次插入,这比我的测试要好得多。我想知道我是否缺少一些基本的东西?

根据mongostat,您只有 3 个连接处于活动状态,您的锁定百分比仅为 10% 左右。

  • 您是否对输入进行了多线程处理?
  • 您要在同一台计算机上破坏这一切吗?
  • 系统 IO 怎么样?
  • 你在WriteConcern.Safe吗?

这些都是可能会影响您的吞吐量的考虑因素。

在这种情况下,文件大小约为 1TB 是否合理?

根据您的db.stats(),您只使用了大约 600 MB 的磁盘。

"storageSize" : 610770944 // = 610,770,944

您的平均对象大小为 622 字节,但您有 815,197 个对象,而不是您声称拥有的 90k 个文档。

我可以做些什么来帮助减少文件大小?

是的,减少 JSON 文档中键的大小。例如:

"something1" : "my class is cool !"  => ~28 bytes
"s1": "my class is cool !"           => ~20 bytes

确保您正确存储了缩短的名称,并让您的数据访问框架将这些名称映射到更合理的名称。

【讨论】:

  • 我不确定这些故障,但文档说它仅适用于 linux,我在这里使用的是 win7。是的,我在单线程中执行此操作,因为我需要按顺序执行此操作以模拟顺序用户操作。自从我阅读您的帖子以来,我已经尝试了一些东西,我注意到我有很多不好的东西,比如使用 long uuid 作为 id,这比我使用 int 计数器时慢,还有一些查询的字段没有被索引,使用安全(虽然我似乎无法避免这种情况),以及臭名昭著的使用跳过的分页(对多种类型的字段进行排序)。感谢您的洞察力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 2011-09-30
  • 2011-03-02
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
相关资源
最近更新 更多