Node.js NodeJS+;Mongodb性能问题

Node.js NodeJS+;Mongodb性能问题,node.js,mongodb,Node.js,Mongodb,我有一个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时(甚至2个或更多并发连接似乎会线性增加时间),它会遇到困难(时间>=

我有一个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时(甚至2个或更多并发连接似乎会线性增加时间),它会遇到困难(时间>=1秒):

上面是我用来从节点应用程序捕获分析信息的分析服务器的输出。因此,基本上,我将以下内容用于分析应用程序:

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'})
使用具有索引的用户\u权限:

db.user_permission.ensureIndex({username: 1, permission_type: 1});
时间随着并发用户的增加而线性增加

编辑2

已尝试为mongod启用评测(-profile=2--slowms=100)

每次我对其运行ab时,db都会损坏,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驱动程序池大小为1外,mongod是否对允许的并发连接数进行了限制, 一大堆事情:

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

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

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

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


这应该可以帮助你开始

要使用mongo db和node js,我发现文档有问题

这对我很有用:

  • 要设置分析级别,请执行以下操作:
    const set=wait 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)
      })
  })
}

在不知道查询或索引的情况下有点困难,只是用示例queryA更新了Jonathan。有两件事要确保不是问题:您是在重用连接还是为每个find()调用创建一个新的连接?这些都在同一台机器上运行吗?嗨,shelman,我在服务器配置中将connectPool设置为20,这不确保find()调用使用连接池吗?这些都在同一台机器上运行-macbook retina(SSD)是的,请分享一个脚本,我们可以运行它进行调查。
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)
      })
  })
}