【问题标题】:NodeJS + Mongodb performance issuesNodeJS + Mongodb 性能问题
【发布时间】:2012-11-07 00:23:56
【问题描述】:

我有一个 nodejs + mongodb 应用程序像这样连接:

var dbConfig = new mongo.Server(config.db.host, config.db.port, {auto_reconnect: true, poolSize: 20});

var db = new mongo.Db(config.db.name, dbConfig);

在进行基准测试(使用 apache ab)时,发现当并发连接数 > 20 时(时间 >= 1 秒)(即使 2 个或更多并发连接似乎线性增加时间):

[
    {
        "key": "mongoQuery1",
        "min": 2,
        "max": 598,
        "mean": 387.60683760683764,
        "sd": 134.56045668980255,
        "variance": 18106.51650456823
    },
    {
        "key": "mongoQuery2",
        "min": 8,
        "max": 149,
        "mean": 73.14120370370358,
        "sd": 25.141715811881994,
        "variance": 632.1058739654371
    },
    ...
]

以上是我用来从节点应用程序捕获分析信息的分析服务器的输出。所以基本上,我已经把这样的东西用来描述应用程序:

var start = new Date().getTime();

db.collection('TheCollection', query, function(err, col) {
  col.find(query).toArray(function(err, items) {
    var elapsed = new Date().getTime() - start;
    profiler.send('mongoQuery1', elapsed);
  });
});

请注意,集合大小最小(700 条记录),并且所有集合都根据查询进行索引。

我一直在寻找想法,有人知道为什么性能如此糟糕吗?

编辑:

对于一个简单的查询,例如:

db.user_permission.find({ username: 'a', permission_type: 'vehicle'})

user_permission 具有索引:

db.user_permission.ensureIndex({username: 1, permission_type: 1});

时间随着并发用户数线性增加

编辑 2

尝试打开 mongod 的分析 (--profile=2 --slowms=100)

每次我对它运行 ab 时,数据库都会损坏,mongod 日志中会显示以下内容:

Wed Nov 21 10:41:54 [conn4] creating profile collection: knightsbridge.system.profile
Wed Nov 21 10:41:54 [FileAllocator] allocating new datafile /Users/dzhu/data/mongodb/knightsbridge.ns, filling with zeroes...
Wed Nov 21 10:41:54 [FileAllocator] creating directory /Users/dzhu/data/mongodb/_tmp
Wed Nov 21 10:41:54 [FileAllocator] done allocating datafile /Users/dzhu/data/mongodb/knightsbridge.ns, size: 16MB,  took 0.018 secs
Wed Nov 21 10:41:54 [FileAllocator] allocating new datafile /Users/dzhu/data/mongodb/knightsbridge.0, filling with zeroes...
Wed Nov 21 10:41:54 [FileAllocator] done allocating datafile /Users/dzhu/data/mongodb/knightsbridge.0, size: 64MB,  took 0.152 secs
Wed Nov 21 10:41:54 [conn5] Assertion: 10334:Invalid BSONObj size: 0 (0x00000000) first element: EOO
0x10037637b 0x1000afc2e 0x1000b005c 0x10001ea53 0x100233529 0x1002a9b0b 0x1001a0a9f 0x10069518b 0x1002a2a4e 0x1005ca15e 0x10064a0ca 0x100018681 0x10019302c 0x1005a7823 0x7fff8a42f8bf 0x7fff8a432b75 
 0   mongod                              0x000000010037637b _ZN5mongo15printStackTraceERSo + 43
 1   mongod                              0x00000001000afc2e _ZN5mongo11msgassertedEiPKc + 206
 2   mongod                              0x00000001000b005c _ZN5mongo11msgassertedEiRKSs + 12
 3   mongod                              0x000000010001ea53 _ZNK5mongo7BSONObj14_assertInvalidEv + 1475
 4   mongod                              0x0000000100233529 _ZN5mongo13unindexRecordEPNS_16NamespaceDetailsEPNS_6RecordERKNS_7DiskLocEb + 265
 5   mongod                              0x00000001002a9b0b _ZN5mongo11DataFileMgr12deleteRecordEPKcPNS_6RecordERKNS_7DiskLocEbbb + 587
 6   mongod                              0x00000001001a0a9f _ZN5mongo16NamespaceDetails11cappedAllocEPKci + 1535
 7   mongod                              0x000000010069518b _ZN5mongo16NamespaceDetails5allocEPKciRNS_7DiskLocE + 123
 8   mongod                              0x00000001002a2a4e _ZN5mongo11DataFileMgr17fast_oplog_insertEPNS_16NamespaceDetailsEPKci + 126
 9   mongod                              0x00000001005ca15e _ZN5mongo7profileERKNS_6ClientERNS_5CurOpE + 3134
 10  mongod                              0x000000010064a0ca _ZN5mongo16assembleResponseERNS_7MessageERNS_10DbResponseERKNS_11HostAndPortE + 4010
 11  mongod                              0x0000000100018681 _ZN5mongo16MyMessageHandler7processERNS_7MessageEPNS_21AbstractMessagingPortEPNS_9LastErrorE + 257
 12  mongod                              0x000000010019302c _ZN5mongo3pms9threadRunEPNS_13MessagingPortE + 1084
 13  mongod                              0x00000001005a7823 thread_proxy + 163
 14  libsystem_c.dylib                   0x00007fff8a42f8bf _pthread_start + 335
 15  libsystem_c.dylib                   0x00007fff8a432b75 thread_start + 13

mongod 版本:

mongod --version
db version v2.2.0, pdfile version 4.5
Wed Nov 21 10:47:24 git version: f5e83eae9cfbec7fb7a071321928f00d1b0c5207

还有

除了默认的nodejs驱动poolSize为1,mongod是否对允许的并发连接数有限制?

【问题讨论】:

  • 在不知道查询或索引的情况下有点困难
  • 嗨乔纳森,刚刚更新了示例查询
  • 有几件事要确保不是问题:您是重复使用连接还是为每个 find() 调用创建一个新连接?这些都在同一台机器上运行吗?
  • 嗨,谢尔曼,我在服务器配置中将 connectPool 设置为 20,这不能确保 find() 调用使用连接池吗?而这些都运行在同一台机器上——macbook Retina (SSD)
  • 是的,请分享一个我们可以运行来调查的脚本。

标签: node.js mongodb


【解决方案1】:

朱珠, 一堆东​​西:

  • 您是否从 mongo shell 尝试过此查询?您可以尝试在 shell 上运行它并使用 .explain() 函数来了解服务器执行时间吗?这将帮助您验证您的索引是否正确,并且应该有助于隔离性能问题是在客户端还是服务器端。

  • 您是否同时进行了写入?这段代码是您在运行基准测试时为数据库提供的唯一工作负载,还是同时进行更多工作?

  • 在运行基准测试时使用 mongostat 实用程序(请参阅 mongodb 文档)。这将使您了解服务器实时执行的操作。特别是,查看锁定 % 和 qr/qw 列。 qr/qw 列告诉您有多少读 + 写操作排队(即,阻塞和等待执行)。

  • 请注意,将 mongo 服务器分析器打开到级别 2 (--profile=2) 将导致服务器记录所有操作,这会严重影响数据库性能。使用 --profile=1 仅记录比 slowMs 慢的操作。然后在您的基准测试完成后,查看 db.system.profile 的内容,了解有关服务器执行的任何慢速操作的详细信息。

这应该可以帮助您入门。

【讨论】:

    【解决方案2】:

    要使用 mongo db 和 node js,我发现 https://docs.mongodb.com 文档存在问题。

    这对我有用:

    • 设置分析级别: const set = await db.setProfilingLevel('all')

    • 要读取配置文件:

    代码

    function profile (db, limit = 10) {
      const mc = db
      return new Promise((resolve, reject) => {
        mc.collection('system.profile').find().limit(limit)
          .sort({ ts: -1 }).toArray((err, res) => {
            if (err) return reject(err)
            resolve(!!res && !!res[0] && res)
          })
      })
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-13
      • 2011-08-19
      • 1970-01-01
      • 2017-05-28
      • 2014-02-16
      • 1970-01-01
      • 2011-06-30
      • 2019-10-16
      • 2012-08-18
      相关资源
      最近更新 更多