type
status
date
slug
summary
tags
category
icon
password
MongoDB Time Series 数据库性能测试报告
1. MongoDB安装
1. 1 安装MongoDB
按照以下步骤使用
apt 软件包管理器安装 安装 MongoDB 8.0 Community Edition。- 从终端安装
gnupg和curl(如果尚未安装):
- 要导入 MongoDB 公共 GPG 密钥,请运行以下命令:
为您的 Ubuntu 版本创建列表文件
/etc/apt/sources.list.d/mongodb-org-8.0.list。为Ubuntu 22.04 (Jammy) 创建列表文件:
- 要安装最新的稳定版本,请执行以下命令:
1.2 初始化系统
- 您可以通过发出以下命令来启动进程:
如果收到类似下方的错误
Failed to start mongod.service: Unit mongod.service not found.首先运行以下命令:
然后再次运行上面的启动命令。
- 您可以通过选择执行以下命令,来确保 MongoDB 将在系统 重新启动后启动:
- 您可以根据需要,通过发出以下命令来停止进程:
- 您可以通过发出以下命令来重启进程:
2. MongoDB写入压测试软件
为了尽可能的模拟中微的应用场景,我基于 influx-stress 软件进行大幅的改动来适配MongoDB, 进行压力测试。 压力测试代码在Mongo-stress仓库
This repository is forked from influxdata/influx-stress.
It is modified to support MongoDB.
2.1 Build Instructions
Building
mongo-stress requires the Golang toolchain. If you do not have the Golang toolchain installed
please follow the instructions golang.org/doc/install2.2 Top Level Command
2.3 Insert Subcommand
2.4 Example Usage
Writing an example series key with 2000 series and 400000 points per second
3. 查询性能测试
同时为了测试 MongoDB 在同一个数据库中,随着数据量的增大,对查询的反应速度进行测试,我也写了相关的测试代码来进行测试,测试代码在mongo-query-test
3.1 硬件平台及OS
CPU:Intel(R) Core(TM) Ultra 5 125H,只开启了一个大核和 8 个 Ecore
内存:16G
OS:Ubuntu 22.04.3 LTS (Jammy Jellyfish)
3.2 说明
- 监控 MongoDB 数据库大小
- 超过阈值时触发查询性能测试
- 支持统计指标:平均时间、最小、最大、P95、有效查询次数
- 查询结果保存 CSV 文件在
results/目录
3.3 使用示例
3.4 查询结果统计
我采用以下命令对 MongDB 进行写入压力测试,模拟 2000 个 sensor,每个 sensor 每隔 5ms 产生一次数据,那么 1 秒钟就产生 400000 条记录,写入 stress 数据中的 sensor collection中,不限定写入时长。
同时,我运行以下命令来同时对数据库进行查询操作,每当数据库大小达到设定的阈值,则触发查询操作,分别基于当前的时间向前推 10s,30 分钟、1 小时,在 2000 个 sensor 中随机产生 10 个 sensor-id,进行 10 次查询,同时统计平均查询时间,最小时间,最大时间,P95 等性能指标,P95 表示在所有统计数据中,95% 的数据值小于或等于该数值,而剩余 5% 的数据值大于该数值。具体统计结果见以下的表格。
10s 时间段 | 1G | 5G | 10G | 20G | 30G | 40G | 50G | 60G | 70G | 80G | 90G | 100G |
Average (s) | 0.3512 | 1.3937 | 4.0583 | 2.4407 | 1.3154 | 1.2776 | 2.3305 | 1.8650 | 2.6243 | 4.6139 | 1.2521 | 2.1927 |
Min (s) | 0.1458 | 0.7509 | 0.7897 | 0.6552 | 0.6341 | 0.5816 | 0.8039 | 0.7183 | 0.7951 | 2.0932 | 0.7720 | 0.8494 |
Max (s) | 1.3952 | 6.1856 | 13.1426 | 10.5259 | 5.9725 | 4.6300 | 5.0000 | 8.5092 | 6.7577 | 12.1943 | 4.3669 | 5.8105 |
P95 (s) | 0.3270 | 1.0159 | 9.5251 | 4.7775 | 1.0932 | 2.0993 | 3.9062 | 3.6753 | 5.7049 | 6.0203 | 1.1528 | 3.2225 |
Count | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 |
30m 时间段 | 1G | 5G | 10G | 20G | 30G | 40G | 50G | 60G | 70G | 80G | 90G | 100G |
Average (s) | 1.1594 | 3.1383 | 9.0631 | 8.7559 | 6.8877 | 6.8288 | 6.6249 | 6.8938 | 6.3927 | 6.1310 | 6.2705 | 7.4086 |
Min (s) | 1.1213 | 2.7605 | 6.2486 | 5.8120 | 4.8335 | 4.4621 | 5.0528 | 5.1933 | 4.8526 | 5.3093 | 4.9620 | 6.0582 |
Max (s) | 1.3019 | 3.5102 | 14.1607 | 13.0477 | 10.8189 | 13.9983 | 10.3266 | 10.1829 | 11.0410 | 9.9066 | 9.8741 | 11.3243 |
P95 (s) | 1.1887 | 3.4492 | 10.9949 | 9.4700 | 8.5692 | 7.1224 | 7.1637 | 9.3052 | 6.7361 | 6.4221 | 7.7417 | 9.5229 |
Count | 174385 | 360000 | 360000 | 360000 | 360000 | 360000 | 360000 | 360000 | 360000 | 360000 | 360000 | 360000 |
1h 时间段 | 1G | 5G | 10G | 20G | 30G | 40G | 50G | 60G | 70G | 80G | 90G | 100G |
Average (s) | 1.1059 | 5.3430 | 24.4075 | 18.6093 | 16.9998 | 15.5227 | 18.0480 | 16.6850 | 14.6864 | 14.8598 | 13.5039 | 16.4913 |
Min (s) | 1.0498 | 4.9404 | 18.6505 | 12.6668 | 13.9997 | 12.0181 | 14.8242 | 11.6221 | 12.1664 | 11.9098 | 11.3289 | 11.9415 |
Max (s) | 1.1971 | 6.3785 | 30.2033 | 23.4632 | 19.9779 | 19.1033 | 20.4751 | 22.4361 | 17.4949 | 18.5662 | 16.6517 | 23.2216 |
P95 (s) | 1.1692 | 5.8464 | 26.9017 | 21.1006 | 19.8289 | 17.4038 | 19.7387 | 20.4293 | 17.0868 | 17.0413 | 16.4445 | 21.9530 |
Count | 176704 | 720000 | 720000 | 720000 | 720000 | 720000 | 720000 | 720000 | 720000 | 720000 | 720000 | 720000 |
根据上面的 测试结果显示:数据的查询速度与数据库的大小无非常明显的相关性
CPU 利用率

磁盘IO 情况
