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.9s到8.9s.如果我没有在中间关闭服务器,这不会发生,但是再次,我可能得到一个基线,7.9s或者我可能得到一个8.9s.
一个数据点的标准偏差(25个查询的运行时间)总是很低(大约0.06),但在所有查询之间,确实很高.
有没有人直截了当为什么会这样,以及如何防止它?我试图找出一个查询是否比另一个更快,但我无法得到一个良好的基线来测试.重启服务器不是绝对必要的,但它会让我的生活更轻松,因为我并不总是让服务器运行.
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 基础知识
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |