了解Mongo 2.6中的读/写锁定

时间:2014-08-26 18:38:05

标签: linux mongodb reactivemongo

我正在使用Mongo 2.6和在Ubuntu Linux上运行的Reactive Mongo驱动程序。

我有一个执行以下操作的过程: 读取记录,增加记录,然后更新记录。 由于各种约束,操作不能更原子化。 记录有点大(100kb-900kb)。

我试图了解这种情况下的锁定行为,因为我看到一些看似奇怪的事情。这包括看似全局锁定的存在以及分片似乎根本不会提高吞吐量的事实。

在多个线程(总共10个线程)上运行此进程时,我会观察到以下内容:

  • 数据库锁平均约为35%
  • 排队读取平均值约为450
  • 排队写入通常偶尔为0
  • Active Reads通常为0
  • 有效写入从0到10不等,但往往更频繁地为0。
  • 当前操作显示了许多更新操作,其中写锁定为" ^"。这些操作似乎永远不会等待锁定。
  • 当前操作显示了许多更新操作,其中写锁定为" ^ MyDatabase"。这些操作通常都在等待锁定。
  • 当前操作显示了许多Query操作,其中锁定写锁定" ^ MyDatabase"。这些操作通常都在等待锁定。

问:使用全局写锁定(" ^")的写操作是否会阻止读取发生?导致这些锁定的原因是什么?

编辑:

以下是我在执行db.currentOp()

时看到的一些操作的一些示例

我最关心的是:

{
    "opid" : 83740,
    "active" : true,
    "secs_running" : 0,
    "microsecs_running" : NumberLong(971125),
    "op" : "update",
    "ns" : "my_database.my_collection_1",
    "query" : {
            "key" : "395b0a88-ccfb-441f-9c98-627b1f772f21",
            "index" : "1000"
    },
    "client" : "xx.xx.xx.xx:123456",
    "desc" : "conn49",
    "threadId" : "0x7fa1c79a2700",
    "connectionId" : 49,
    "locks" : {
            "^" : "w"
    },
    "waitingForLock" : false,
    "numYields" : 0,
    "lockStats" : {
            "timeLockedMicros" : {
                    "r" : NumberLong(0),
                    "w" : NumberLong(336)
            },
            "timeAcquiringMicros" : {
                    "r" : NumberLong(0),
                    "w" : NumberLong(3)
            }
    }
}

但是我看到其他人喜欢以下内容:

{
    "opid" : 1340,
    "active" : false,
    "op" : "update",
    "ns" : "",
    "query" : {
            "key" : "f7e0ce90-0d0e-4094-9a27-b4fc88ca3171"
    },
    "client" : "xx.xx.xx.xx:123456",
    "desc" : "conn41",
    "threadId" : "0x7fa1c81aa700",
    "connectionId" : 41,
    "locks" : {
            "^" : "w",
            "^my_database" : "W"
    },
    "waitingForLock" : true,
    "numYields" : 0,
    "lockStats" : {
            "timeLockedMicros" : {

            },
            "timeAcquiringMicros" : {

            }
    }
},
{
    "opid" : 78506,
    "active" : true,
    "secs_running" : 0,
    "microsecs_running" : NumberLong(3362),
    "op" : "query",
    "ns" : "my_database.my_collection_2",
    "query" : {
            "key" : "2b5c59fa-b649-4c73-91ff-582c21a919ed"
    },
    "client" : "xx.xx.xx.xx:123456",
    "desc" : "conn49",
    "threadId" : "0x7fa1c79a2700",
    "connectionId" : 49,
    "locks" : {
            "^" : "r",
            "^my_database" : "R"
    },
    "waitingForLock" : false,
    "numYields" : 5,
    "lockStats" : {
            "timeLockedMicros" : {
                    "r" : NumberLong(1889),
                    "w" : NumberLong(0)
            },
            "timeAcquiringMicros" : {
                    "r" : NumberLong(830),
                    "w" : NumberLong(0)
            }
    }
}

0 个答案:

没有答案