高背景刷新平均 mongodb

Nic*_*son 7 mongodb linux locking

类似问题:Mongodb 上的高全局锁定百分比

概述

我们在 v2.4.8 mongodb 中有一个生产设置副本集,它运行在五个 4 核、28gb RAM 虚拟机上,标准 azure 数据磁盘 HDD 运行在 64 位 CentOS 6 上。我们以大约 600-700 ops/sec/secondary 的速度在辅助节点上分配读取。每个辅助节点的 CPU 使用率约为 15%。主服务器上的 CPU 使用率约为 5-10%。我们目前在我们的主服务器上遇到高全局写锁和后台刷新平均值的问题。尽管每秒只有大约 200 次插入/更新/删除(请参阅下面的 MMS 输出),但我们的主服务器上的全局写锁定在 30-40% 之间。我们还注意到,我们的后台刷新平均值在 2 到 15 秒之间。不幸的是,这会导致大量缓慢的查询(每秒最多 50 次更新/插入 > 100 毫秒)。我们已经考虑过分片,但觉得 mongodb 应该表现得比这更好。

测试

这告诉我,我们在写入 HDD 时遇到问题,但运行一个简单的 iostat 显示我们在 sdc(我们正在写入的磁盘)上的利用率没有达到最大值,并且在 20% 到 40% 之间:

$ iostat -x 1
Run Code Online (Sandbox Code Playgroud)

4秒结果:

Linux 2.6.32-279.14.1.el6.openlogic.x86_64 (mongodb3-wus)   05/08/2014  _x86_64_    (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.28    0.00    1.82    5.50    0.00   87.40

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.05     0.04    0.06    0.11     3.25     1.23    26.13     0.00   18.07  14.87   0.25
sdc               0.02   216.57    1.70   95.83   216.22  3106.45    34.07     9.27   95.07   4.32  42.11
sdb               0.00    11.35    0.01    0.56     0.05    95.25   169.44     0.01   18.44   0.11   0.01

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.56    0.00    2.05    0.00    0.00   95.38

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00   15.00     0.00   624.00    41.60     0.20   11.80  13.47  20.20
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.07    0.00    3.07    0.26    0.00   93.61

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00    3.00   15.00    24.00   352.00    20.89     0.25   15.17  13.44  24.20
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.33    0.00    1.79    0.77    0.00   94.10

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00    11.00    0.00   17.00     0.00   768.00    45.18     0.26   15.18  14.35  24.40
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
Run Code Online (Sandbox Code Playgroud)

我还使用 dd 运行了一个简单的负载测试:

dd if=/dev/zero of=/dev/sdc1 count=512 bs=1024k
Run Code Online (Sandbox Code Playgroud)

本次测试结果显示写入速度为~840 MB/s:

512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 0.638451 s, 841 MB/s
Run Code Online (Sandbox Code Playgroud)

mongodb 的 Ulimit 结果:

[mongod #8066 -- limits]
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            10485760             unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             224341               224341               processes 
Max open files            20000                20000                files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       224341               224341               signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us   
Run Code Online (Sandbox Code Playgroud)

MMS、Mongostat、Mongotop 主要用于

我还在下面提供了我们的 MMS 输出、mongostat 和 mongotop 输出:

!MMS: MMS 输出点击这里

蒙古统计局:

connected to: 127.0.0.1:27019
    insert  query update delete getmore command flushes mapped  vsize    res faults      locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn set repl       time 
        26     41     95     *0     294   178|0       0  52.4g   107g  25.1g      0  chronicle:5.6%          0      65|2     1|4    45k   136k   486 rs0  PRI   23:15:18 
        96    158    524     *0    1266   783|0       0  52.4g   107g  25.1g      1 chronicle:82.9%          0       0|0     0|0   235k   759k   486 rs0  PRI   23:15:19 
        33     62    109     *0     637   253|0       0  52.4g   107g  25.1g      0      local:7.2%          0       0|0     0|0    78k   208k   486 rs0  PRI   23:15:20 
        58     89    153     *0     920   321|0       0  52.4g   107g  25.1g      0     local:16.1%          0       0|0     0|1   113k   569k   486 rs0  PRI   23:15:21 
        55     95    138     *0     887   322|0       0  52.4g   107g  25.1g      0 chronicle:20.3%          0       0|0     0|0   111k   297k   486 rs0  PRI   23:15:22 
        24     59     81     *0     217   174|0       0  52.4g   107g  25.1g      1         .:88.5%          0      23|0     0|1    46k   141k   486 rs0  PRI   23:15:23 
        51     64    136     *0     760   263|0       0  52.4g   107g  25.1g      0 chronicle:17.1%          0       0|0     0|0    93k   266k   486 rs0  PRI   23:15:24 
        42     60    129     *0     695   288|0       0  52.4g   107g  25.1g      0      local:7.3%          0       0|0     0|0    90k   253k   486 rs0  PRI   23:15:25 
        33     55     99     *0     693   215|0       0  52.4g   107g  25.1g      1      local:3.1%          0       0|0     0|0    76k   455k   486 rs0  PRI   23:15:26 
        45     70     95     *0     763   250|0       0  52.4g   107g  25.1g      1      local:9.0%          0       0|0     0|0    88k   225k   486 rs0  PRI   23:15:27 
Run Code Online (Sandbox Code Playgroud)

蒙哥特:

connected to: 127.0.0.1:27019

                                     ns       total        read       write     2014-05-07T23:09:17
                      chronicle.ledgers        93ms         0ms        93ms
                         local.oplog.rs        47ms        47ms         0ms
                         cliqueme.sites        13ms         0ms        13ms
                    chronicle.analytics         4ms         0ms         4ms
          chronicle_test.system.indexes         0ms         0ms         0ms
       chronicle_test.system.namespaces         0ms         0ms         0ms
            chronicle_test.system.users         0ms         0ms         0ms

                                     ns       total        read       write     2014-05-07T23:09:18
                      chronicle.ledgers       101ms         0ms       101ms
                         local.oplog.rs        66ms        66ms         0ms
                       cliqueme.cliques        19ms         0ms        19ms
                    chronicle.analytics         6ms         0ms         6ms
                         cliqueme.sites         4ms         0ms         4ms
                           local.slaves         1ms         0ms         1ms
                 cliqueme.notifications         0ms         0ms         0ms
                      cliqueme.messages         0ms         0ms         0ms

                                     ns       total        read       write     2014-05-07T23:09:19
                         local.oplog.rs        66ms        66ms         0ms
                      chronicle.ledgers        52ms         0ms        52ms
                    chronicle.analytics        24ms         0ms        24ms
                       cliqueme.cliques         7ms         0ms         7ms
                         cliqueme.sites         4ms         0ms         4ms
                           local.slaves         1ms         0ms         1ms
                 cliqueme.notifications         0ms         0ms         0ms
                      cliqueme.messages         0ms         0ms         0ms

                                     ns       total        read       write     2014-05-07T23:09:20
                      chronicle.ledgers      1842ms         0ms      1842ms
                         cliqueme.sites       885ms         0ms       885ms
                       cliqueme.cliques        70ms         0ms        70ms
                         local.oplog.rs        55ms        55ms         0ms
                    chronicle.analytics         5ms         0ms         5ms
                           local.slaves         1ms         0ms         1ms
                 cliqueme.notifications         0ms         0ms         0ms
                      cliqueme.messages         0ms         0ms         0ms

                                     ns       total        read       write     2014-05-07T23:09:21
                      chronicle.ledgers        84ms         0ms        84ms
                         local.oplog.rs        64ms        64ms         0ms
                         cliqueme.sites        41ms         0ms        41ms
                       cliqueme.cliques        11ms         0ms        11ms
                    chronicle.analytics         4ms         0ms         4ms
          chronicle_test.system.indexes         0ms         0ms         0ms
       chronicle_test.system.namespaces         0ms         0ms         0ms
            chronicle_test.system.users         0ms         0ms         0ms

                                     ns       total        read       write     2014-05-07T23:09:22
                      chronicle.ledgers       276ms         0ms       276ms
                         local.oplog.rs        90ms        90ms         0ms
                       cliqueme.cliques        16ms         0ms        16ms
                    chronicle.analytics         6ms         0ms         6ms
                         cliqueme.sites         4ms         0ms         4ms
                           local.slaves         1ms         0ms         1ms
                 cliqueme.notifications         0ms         0ms         0ms
                      cliqueme.messages         0ms         0ms         0ms
Run Code Online (Sandbox Code Playgroud)

有没有人对我们如何优化此性能有任何建议?我们听说有些人可以在独立的情况下每秒进行高达 2K 的写入?从 HDD 切换到 RAID 或 SSD 可能会解决这个问题吗?

我们想使用分片作为最后的手段。

更新:我们仍然无法解决这个问题,但是因为我们需要一个快速的解决方案,所以我们已经转移到了一个分片集群。我们仍然想弄清楚这个问题,因为它仍然在分片集群中影响我们。

Ted*_*ott 5

您的 mongo 统计数据显示更新次数比插入次数多。可能导致高写锁定问题的一件事是,如果您的更新通常会增加文档大小并导致文档在数据文件中移动。我们自己遇到了这个问题,但当时我们正在与 mongo 支持人员合作以找出答案,所以我不记得是什么指标或统计数据会告诉您这种情况。如果您的文档尺寸非常大,这可能只是一个问题。我们最终拆分了一个总是被添加到它自己的集合中的子数组,这样我们只是添加新文档而不是修改现有文档。

集合上的 usePowerOf2Sizes 标志也可以通过为文档提供增长空间来帮助缓解这种情况。这显然是 2.6 现在的默认设置,但如果您还没有使用 2.6,则需要将其打开。此处描述的设置:http : //docs.mongodb.org/manual/reference/command/collMod/