假设我启动了mongo db服务器:
mongo --dbpath=/some/path --port=12345 --storageEngine wiredTiger
然后我运行相同的查询10次(忽略第一个,以便它们都在暖缓存上),如下所示:
mongo query1.js
我得到的时间是(通过time
和mongodb记录器验证):
8137ms
8145ms
8193ms
8091ms
8152ms
8110ms
8182ms
8142ms
8133ms
8098ms
很棒 - 相当一致。所有这些都在彼此约100毫秒之内,这是有道理的。
然后我以任何以下方式关闭服务器:
pkill mongod
mongod --dbpath=/some/path --shutdown
mongo shutdown.js
shutdown.js
包含的位置:
db.getSiblingDB('admin').shutdownServer();
然后我使用完全相同的命令重新启动它,我得到以下时间:
8531ms
8492ms
8613ms
8555ms
8538ms
8512ms
8551ms
8511ms
8608ms
8522ms
同样,它们始终在~100ms内,但它们都处于不同的基线。
如果我再次这样做,可能会在8.3
,8.6
,8.9
或其间的任何地方。没有其他用户进程打开(除了那些需要进入机器的用户进程)。
我按如下方式进行了实验:
while True:
run the query 25 times and record the minimum such runtime
shutdown the server and restart it, wait for it to listen
这周末运行了两天,而我没有与机器交互,收集了223个数据点,最小运行时间从7.9s
到8.9s
不等。如果我之间没有关闭服务器,这不会发生,但同样,我可能会获得7.9s
的基线,或者我可能会获得8.9s
之一。
一个数据点的标准偏差(25个查询的运行时间)总是非常低(大约0.06),但在所有查询之间,确实很高。
有没有人直截了当为什么会这样,以及如何防止它?我试图弄清楚一个查询是否比另一个查询更快,但我无法获得一个良好的基线来进行测试。重新启动服务器并不是绝对必要的,但它会让我的生活更轻松,因为我并不总是让服务器运行。
答案 0 :(得分:0)
MongoDB使用缓存来提供一些查询。重新启动服务器时,必须清除某些缓存。 MongoDB将所有最近使用的数据保存在RAM中。如果您为查询创建了索引,并且您的工作数据集适合RAM,则MongoDB将从内存中提供所有查询。
查询计划保存在缓存中,在mongo restart上清除。因此,第一次运行查询需要时间。见explain(“executionStats”)。
使用 WiredTiger ,MongoDB同时使用文件系统缓存和WiredTiger缓存。默认情况下,从MongoDB 3.2开始,WiredTiger缓存将使用60%的RAM减去1 GB,否则它将使用1 GB,以较大者为准。对于具有高达10 GB RAM的系统,这小于或等于3.0设置。对于RAM超过10 GB的系统,配置大于3.0设置。
在MongoDB 3.0中,默认情况下,WiredTiger缓存使用1 GB或已安装物理RAM的一半,以较大者为准。
MongoDB还会通过文件系统缓存自动使用机器上的所有可用内存(压缩文件系统缓存中的数据)。
答案 1 :(得分:0)
MongoDB将当前处理数据保存在RAM中,因此您的查询请求可能在同一请求中占用不同的时间。 This link会帮助你。