mongostat 中的锁定百分比是什么意思?

ede*_*ill 6 performance-tuning mongodb

在运行 mongostat 查看我们的 mongo 数据库时,我会经常看到锁定的 % 数字跳起来,有时高达 80%。下面是一些示例行:

insert  query update delete getmore command flushes mapped  vsize    res faults locked % idx miss %     qr|qw   ar|aw  netIn netOut  conn       time 
 0     10      7      0       0      17       0  2.27g     5g  1.63g      0      0.1          0       0|0     0|0    22k     7k    83   15:46:10 
 0     21      7      1       0      23       0  2.27g     5g  1.73g      0      0.1          0       0|0     0|1    11k   424k    83   15:46:11 
 0     28     10      3       0      28       0  2.27g     5g  1.73g      0     26.9          0       0|0     0|0    33k   196k    83   15:46:12 
 0     17      6      3       0      13       0  2.27g     5g  1.72g      0     18.2          0       0|0     0|0    11k    10k    83   15:46:13 
 0     18      5      1       0      11       0  2.27g     5g  1.73g      0      0.1          0       0|0     0|0    23k   362k    83   15:46:14 
Run Code Online (Sandbox Code Playgroud)

mongostat 的帮助说它是

锁定 - 全局写锁的时间百分比

我的理解是写锁定整个数据库。如果我在同一个 mongo 服务器(A 和 B)上有两个数据库,那么写在 A 块上会写在 B 上吗?一个数据库上一半的时间是否意味着它会显示 25%(就像在双核机器上使用一半的内核一样),还是会显示 50%?

小智 5

是的,MongoDB 使用全局写锁(服务器范围),因此 mongostat 报告的“lock %”表示服务器在最后一个采样周期(一秒)内在全局写锁中花费的总时间——对于所有操作在所有数据库上。

随着您执行更多的写入操作,例如更新、插入、删除和评估,该值将会增加。

对于独立服务器,上面示例中的数字并不令人担忧。

但是,80% 的常规读数表明您可能希望在更多服务器之间平衡读取和写入,或者将您的集合分片,尽管我希望在性能问题之前先进行分片以缓解存储问题。

一般来说,优化的关键包括正确和全面的索引、限制结果、使用分析器和解释()来发现瓶颈,并确保正确使用驱动程序(试验光标批量大小可以产生显着的改进)。