我的情况是我在Mongo中运行了几个查询并测量了响应时间。我知道Mongo使用Memory Mapped文件并在RAM中缓存一些数据。
如果我创建索引并运行查询,则执行时间为2,07秒。当我再次运行查询时,执行时间为0,017秒。
这意味着操作系统在第一次访问时将文件映射到内存中,操作系统会将其保留在缓存中,直到它决定将其分页。
因为我想制作一些基准测试,我想以某种方式从内存中删除映射结果。
free -g:
total used free shared buffers cached
Mem: 29 29 0 0 0 29
-/+ buffers/cache: 0 29
Swap: 0 0 0
我尝试db.collection.getPlanCache().clear()
但它不起作用。
然后我尝试:
sudo service mongod stop
我重启机器
sync; echo 3 > /proc/sys/vm/drop_caches
sudo service mongod start
免费-g:
total used free shared buffers cached
Mem: 29 0 0 0 0 0
-/+ buffers/cache: 0 29
Swap: 0 0 0
在上面,似乎缓存现在是免费的。但是当我再次执行查询时,执行时间是0,017秒。似乎mongo设法在某处缓存或保存数据。当我清除缓存时,所需的执行时间将是2,07秒。
同样mongostat
给出:
insert query update delete getmore command flushes mapped vsize res faults qr|qw ar|aw netIn netOut conn set repl time
*0 *0 *0 *0 0 1|0 0 124.0G 248.9G 27.7G 1 0|0 0|0 79b 11k 13 rs0 PRI 12:37:06
*0 *0 *0 *0 1 5|0 0 124.0G 248.9G 27.7G 0 0|0 0|0 687b 11k 13 rs0 PRI 12:37:07
*0 *0 *0 *0 2 1|0 0 124.0G 248.9G 27.7G 0 0|0 0|0 173b 11k 13 rs0 PRI 12:37:08
*0 *0 *0 *0 1 5|0 0 124.0G 248.9G 27.7G 0 0|0 0|0 687b 11k 13 rs0 PRI 12:37:09
*0 *0 *0 *0 0 1|0 0 124.0G 248.9G 27.7G 0 0|0 0|0 79b 11k 13 rs0 PRI 12:37:10
有谁能告诉我如何才能真正删除Mongo中的缓存结果?