当运行 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
mongostat 的帮助说它是
锁定 - 全局写锁定的时间百分比
我的理解是写入会锁定整个数据库。如果我在同一个 mongo 服务器上有两个数据库(A 和 B),A 上的写入会阻止 B 上的写入吗?一个数据库上一半的时间是否意味着它会显示 25%(例如在双核机箱上使用一个核心的一半),还是会显示 50%?
答案1
是的,MongoDB 使用全局写锁(服务器范围),因此 mongostat 报告的“锁定 %”表示服务器在最后一个采样周期(一秒)内花在全局写锁上的总时间——针对所有数据库上的所有操作。
随着您执行更多的写入操作(例如更新、插入、删除和评估),这个值将会增加。
对于独立服务器来说,上面示例中的数字并不令人担忧。
不过,如果定期读取 80%,则表明您可能需要在更多服务器上平衡读写操作或对集合进行分片,不过我会先使用分片来缓解存储问题,然后再解决性能问题。
一般来说,优化的关键包括正确而全面的索引、限制结果、使用分析器和 explain() 来发现瓶颈,以及确保您正确使用驱动程序(尝试使用光标批量大小可以产生显着的改进)。
答案2
高写入锁定百分比并不是性能的唯一指标。您应该将此数字与写入队列相结合,写入队列指示了排队获取锁定的插入/更新/更新插入和删除操作的数量(总计)。如果这两个数字一直居高不下,则存在问题,应立即解决。如果是这种情况,请先找出最慢的查询,进行分析并尝试对其进行调整。当无法进一步调整时,请转向服务器上分配的资源。