2011-12-13 56 views
1

我正在创建一个应用程序,它有几个服务器同时运行,并且在每个服务器上有多个进程正在处理数据,以便查询/更新和插入。因此,总共有35个以上的并发连接正在进行。这些服务器都处理发送到单个mongodb服务器(mongod)的数据。目前我没有分割我的数据库。问题是我受到我的mongodb服务器的限制。每当我添加更多的服务器时,查询/更新/插入的运行速度会变慢(它们需要更多时间)。我正在运行这个mongohq.com,然后我最近为mongod创建了我自己的amazon服务器,但我仍然得到几乎相同的结果。下面的列表是我的db.serverStatus({})。我对mongodb有点新,但基本上我需要知道如何加快mongo服务器进行并发操作的过程。我需要它能够处理很多请求。我知道分片是一种可能的解决方法,但如果可以的话,你可以列出一些可用的其他解决方案。谢谢。MongoDB限制并发量

> db.serverStatus({}) 
{ 
"host" : "ip-10-108-245-21:28282", 
"version" : "2.0.1", 
"process" : "mongod", 
"uptime" : 11380, 
"uptimeEstimate" : 11403, 
"localTime" : ISODate("2011-12-13T22:27:56.865Z"), 
"globalLock" : { 
    "totalTime" : 11380429167, 
    "lockTime" : 86138670, 
    "ratio" : 0.007569017717695356, 
    "currentQueue" : { 
     "total" : 0, 
     "readers" : 0, 
     "writers" : 0 
    }, 
    "activeClients" : { 
     "total" : 35, 
     "readers" : 35, 
     "writers" : 0 
    } 
}, 
"mem" : { 
    "bits" : 64, 
    "resident" : 731, 
    "virtual" : 6326, 
    "supported" : true, 
    "mapped" : 976, 
    "mappedWithJournal" : 1952 
}, 
"connections" : { 
    "current" : 105, 
    "available" : 714 
}, 
"extra_info" : { 
    "note" : "fields vary by platform", 
    "heap_usage_bytes" : 398656, 
    "page_faults" : 1 
}, 
"indexCounters" : { 
    "btree" : { 
     "accesses" : 798, 
     "hits" : 798, 
     "misses" : 0, 
     "resets" : 0, 
     "missRatio" : 0 
    } 
}, 
"backgroundFlushing" : { 
    "flushes" : 189, 
    "total_ms" : 29775, 
    "average_ms" : 157.53968253968253, 
    "last_ms" : 185, 
    "last_finished" : ISODate("2011-12-13T22:27:16.651Z") 
}, 
"cursors" : { 
    "totalOpen" : 34, 
    "clientCursors_size" : 34, 
    "timedOut" : 0, 
    "totalNoTimeout" : 34 
}, 
"network" : { 
    "bytesIn" : 89743967, 
    "bytesOut" : 59379407, 
    "numRequests" : 840133 
}, 
"opcounters" : { 
    "insert" : 5437, 
    "query" : 8957, 
    "update" : 4312, 
    "delete" : 0, 
    "getmore" : 76, 
    "command" : 821388 
}, 
"asserts" : { 
    "regular" : 0, 
    "warning" : 0, 
    "msg" : 0, 
    "user" : 0, 
    "rollovers" : 0 
}, 
"writeBacksQueued" : false, 
"dur" : { 
    "commits" : 29, 
    "journaledMB" : 0.147456, 
    "writeToDataFilesMB" : 0.230233, 
    "compression" : 0.9999932183619632, 
    "commitsInWriteLock" : 0, 
    "earlyCommits" : 0, 
    "timeMs" : { 
     "dt" : 3031, 
     "prepLogBuffer" : 0, 
     "writeToJournal" : 29, 
     "writeToDataFiles" : 2, 
     "remapPrivateView" : 0 
    } 
}, 
"ok" : 1 

}

+0

我在状态报告中看不到任何内容这看起来像一个大问题。队列是空的,锁比率低,看起来不算太坏。 v2应该比旧版本具有更好的并发性。我建议你发布在谷歌用户组。 – mnemosyn 2011-12-13 22:26:33

+0

谢谢,是的,我只是更新了我的serverStatus响应。我正在显示一个不正确的 - 我的错误。我将发布到谷歌用户组。我正在运行mongo v2.0.1。我也在和mongohq的支持交流,他们说这可能是索引问题,我们正在寻求解决方案。 – PetersCodeProblems 2011-12-13 22:33:17

回答

1

令人惊讶的更多负载从mongod的生成更高的响应时间?性能下降有几个可能的原因。

例如,每次写入mongod都使用进程宽写入锁定。因此,尝试添加更多更新的服务器(假设每个服务器的更新负载稳定),因此进程在写入锁定时花费的时间越长。您可以通过mongostat的“锁定%”字段来关注此问题。如果你使用JS支持的功能(m/r,db.eval()等),这些操作不能由mongod同时执行,因为每个mongod都有一个JavaScript上下文(它是单线程的)。

如果你想要更具体的分析,那么你可能要考虑张贴确切的数字。每秒执行多少次读写操作,执行查询的查询计划是什么,添加额外的应用服务器会对整体数据库性能产生什么影响等等。