最近,我们的 MongoDB 的 CPU/内存和 I/O 使用率很高。在检查日志时,我发现的只是insert
这一时期的一些内容。在检查日志时,我注意到大多数插入日志都bytesRead
位于存储部分。所以我怀疑这会导致 I/O 然后缓存数据导致高内存。
插入峰值后,I/O 和 CPU 下降,但内存保持不变,重新启动后问题得到解决。
插入操作该磁盘读取是否正常?我们在 CentOS7 VM 中使用带有存储引擎的Mongo v4.0WiredTiger
。
2024-02-14T23:39:44.533+0800 I COMMAND [conn939845] insert db.user_log ninserted:1 keysInserted:11 numYields:0 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { w: 1 } }, Collection: { acquireCount: { w: 1 } } } storage:{ data: { bytesRead: 34390, timeReadingMicros: 140837 } } 141ms
2024-02-14T23:40:16.785+0800 I COMMAND [conn939845] insert db.user_log ninserted:1 keysInserted:11 numYields:0 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { w: 1 } }, Collection: { acquireCount: { w: 1 } } } storage:{ data: { bytesRead: 24150, timeReadingMicros: 506594 } } 507ms
是的,在这种情况下,这很正常。
MongoDB使用WiredTiger进行存储,它将所有数据和索引存储在b树结构中。更新 btree 将需要读取树的根页面,然后根据树深度读取内部页面,最后读取存储数据的叶页面。
keysInserted:11
表示插入文档还需要插入11个索引键。如果有 11 个不同的索引,则意味着还要读取每个索引的根页、内部页和叶页。如果这些页面中的任何一个已经在缓存中,这将减少需要从磁盘读取的总量,因此您可能会看到类似插入的显着不同的数字。