hi,大家好,有个问题想请教下大家,我们最近将mongodb从2.2.2版本升级到了3.4.6版本,用的是WiredTiger引擎,运行一段时间后,发现几个不是很能理解的问题。
数据总大小(包括local里的oplog数据20G左右)
但是通过top查看内存情况,达到了104G
疑问1:为什么实际使用内存比存储内存大那么多?
疑问2:我设置了启动参数wiredTigerCacheSizeGB=100,但是现在使用内存超过了100G,看官网文档上说,mongodb有两部分内存,一个是WiredTiger internal cache,一个是file system cache,wiredTigerCacheSizeGB参数设置的应该是 internal cache,那整个mongodb的使用内存大小能通过参数设置吗,如果不能设置,那不是无限占用内存(官网说MongoDB automatically uses all free memory that is not used by the WiredTiger cache or by other processes)。
疑问3:oplog的数据会全部放到内存吗,还是只放入一部分热数据
热数据和索引在内存,保证了高速
1.热数据
这一点是SQL和nosql之间的巨大差距,将热数据存在内存相当于自带cache,若wiredtigercache大小控制合理,此处内存性价比相当高。
2.索引
跟热数据同样
3.连接所消耗内存
这里算是与SQL基本相同的一部分
使用mlogfilter查看索引使用效率不高的MongoDB查询语句 如下所示
2017-10-28T06:40:08.791+0000 I COMMAND [conn4431] command foo.data_02 command: find { find: "data_02", filter: { $and: [ ... ] }, projection: { ...}, limit: 50, shardVersion: [ Timestamp 0|0, ObjectId('000000000000000000000000') ] } planSummary: IXSCAN { field1: -1.0, field2: -1.0 } keysExamined:589735 docsExamined:589735 cursorExhausted:1 keyUpdates:0 writeConflicts:0 numYields:4610 nreturned:0 reslen:217 locks:{ Global: { acquireCount: { r: 9222 } }, Database: { acquireCount: { r: 4611 } }, Collection: { acquireCount: { r: 4611 } } } protocol:op_command 8785ms
扫描了58万多条记录,却返回了0条 我想知道像这种情况MongoDB到底是怎么缓存数据的呢?
即只缓存返回结果(0) 还是所有扫描的记录呢(589735)。从内存的角度来说的话, 是返回结果越少内存占用越小 还是 扫描记录越少 内存占用越小?
另外WiredTiger又分两种缓存
WiredTiger internal cache
filesystem cache
这两个缓存是怎么分配的呢?
是internal cache 满了再用filesystem cache呢?
还是同时都有分配呢? 那么这种情况下 什么数据进internal cache 什么数据进filesystem cache呢?