MongoDB - 重新启动服务器后的不同查询执行时间

use*_*781 16 profiling mongodb

假设我启动了一个mongo数据库服务器:

mongo --dbpath=/some/path --port=12345 --storageEngine wiredTiger

然后我运行相同的查询10次(忽略第一个,以便它们都在暖缓存上),如下所示:

mongo query1.js

我得到的时间是(通过timemongodb记录器验证):

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,或在真正之间的任何地方.没有其他用户进程打开(除了那些需要ssh进入机器).

我按如下方式进行了一项实验:

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),但在所有查询之间,确实很高.

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

Som*_*luk 2

MongoDB 使用缓存来处理一些查询。当您重新启动服务器时,必须清除一些缓存。MongoDB 将所有最近使用的数据保存在 RAM 中。如果您已经为查询创建了索引并且工作数据集适合 RAM,则 MongoDB 会从内存中提供所有查询。

查询计划保存在缓存中,该缓存会在 mongo 重新启动时清除。所以第一次运行查询需要时间。请参阅解释(“executionStats”)。

通过WiredTiger,MongoDB 同时利用文件系统缓存和 WiredTiger 缓存。默认情况下,从 MongoDB 3.2 开始,WiredTiger 缓存将使用 RAM 的 60% 减去 1 GB,或者使用 1 GB,以较大者为准。对于 RAM 高达 10 GB 的系统,该值小于或等于 3.0 设置。对于 RAM 超过 10 GB 的系统,配置大于 3.0 设置。

在 MongoDB 3.0 中,WiredTiger 缓存默认使用 1 GB 或已安装物理 RAM 的一半,以较大者为准。

MongoDB 还通过文件系统缓存自动使用机器上的所有空闲内存(文件系统缓存中的数据被压缩)。

请参阅MongoDB 基础知识