MongoDB - 重启服务器

时间:2015-11-16 18:52:02

标签: mongodb profiling

假设我启动了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.38.68.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.9s8.9s不等。如果我之间没有关闭服务器,这不会发生,但同样,我可能会获得7.9s的基线,或者我可能会获得8.9s之一。

一个数据点的标准偏差(25个查询的运行时间)总是非常低(大约0.06),但在所有查询之间,确实很高。

有没有人直截了当为什么会这样,以及如何防止它?我试图弄清楚一个查询是否比另一个查询更快,但我无法获得一个良好的基线来进行测试。重新启动服务器并不是绝对必要的,但它会让我的生活更轻松,因为我并不总是让服务器运行。

2 个答案:

答案 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还会通过文件系统缓存自动使用机器上的所有可用内存(压缩文件系统缓存中的数据)。

参见MongoDB Fundamentals

答案 1 :(得分:0)

MongoDB将当前处理数据保存在RAM中,因此您的查询请求可能在同一请求中占用不同的时间。 This link会帮助你。