【问题标题】:MongoDB limiting the amount of concurrencyMongoDB限制并发量
【发布时间】:2012-01-19 17:23:29
【问题描述】:

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

> 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

}

【问题讨论】:

  • 我在状态报告中看不到任何看起来像大问题的东西。队列是空的,锁定率很低,看起来还不错。 v2 也应该比旧版本具有更好的并发性。我建议你在谷歌用户组上发布这个。
  • 谢谢,是的,我刚刚更新了我的 serverStatus 响应。我正在展示一个不正确的 - 我的错误。我将发布到谷歌用户组。我正在运行 mongo v2.0.1。我也在与 mongohq 支持人员交谈,他们说这可能是索引问题,我们正在研究解决方案。
  • 听起来你执行了很多命令。你在运行很多 map/reduce、javascript 等吗?如果是这样,请求就不能并发执行。

标签: php concurrency mongodb


【解决方案1】:

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

例如,对 mongod 的每次写入都使用进程范围的写入锁。因此,您添加的服务器越多,尝试的更新就越多(假设每个服务器的更新负载大约是稳定的),因此进程在写锁定中花费的时间越长。您可以通过 mongostat 的“locked %”字段来关注这一点。

此外,如果您使用 JS 驱动的功能(m/r、db.eval() 等),这些操作不能由 mongod 并发执行,因为每个 mongod 都有一个 JavaScript 上下文(它是单线程的) .

如果您想要更具体的分析,那么您可能需要考虑发布确切的数字。每秒读取和写入的次数、您执行的查询的查询计划是什么、添加额外的应用服务器对您的整体数据库性能有什么影响等。

【讨论】:

  • 谢谢,这让我对要查找的内容有了更好的了解。问题最终主要是索引问题。
  • 啊,是的,这通常是您遇到性能问题时首先要看的地方;)
  • 哈哈是的。不是我以前没有这样做过,这更像是索引嵌入式键的一个简单错误。我不知道我必须使用点符号。
猜你喜欢
  • 1970-01-01
  • 2012-02-20
  • 2015-12-06
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多