Keyhole操作文档
简介
- Keyhole 是一个用 GO (Golang) 编写的性能分析工具,用于收集统计信息并分析 MongoDB 集群的性能。在使用Keyhole进行性能分析时,不需要安装额外的解释器或软件来获取分析结果,使用Keyhole得到的分析结果可以通过Mobi(毛笔)转换成HTML。
- keyhole项目地址:simagix/keyhole: Survey Your Mongo Land - MongoDB Performance Analytics (github.com)
Keyhole说明文档
Part1
Download keyhole
-
性能评估和调优是应用程序开发生命周期的重要组成部分。无响应的应用程序体验可能是资源供应不足和软件调整不当的组合。当遇到应用程序性能缓慢时,许多人通常会很快将责任归咎于数据库,但很少有人能够找出问题所在。
Keyhole,作为一个开源项目提供,目的是拥有一个工具来快速从 MongoDB 集群收集统计数据并在几分钟内生成性能分析摘要。有一些开源工具可用于解决某些兴趣,但没有什么比 keyhole 为性能评估提供的工具更完整了。使用 keyhole 就像在 MongoDB 集群上进行 CAT 扫描。这些信息包括 MongoDB 配置、集群统计信息、数据库架构、索引和索引使用情况。您还可以确定您的性能问题是否与硬件资源(例如物理 RAM、CPU 和磁盘 IOPS)不足和/或没有正确索引的慢速查询有关。
Keyhole 是用 Go 编写的,预编译的可执行文件可供 Linux、Windows 和 macOS 下载。此 GitHub 链接中详细介绍了下载说明。要验证Keyhole安装,请使用:
keyhole --version
还可以使用以下命令查找所有keyhole用法:
keyhole --help
New Installation Validation
-
安装和配置 MongoDB 集群后,通常会连接到集群并执行检查。 Keyhole 接受一个 mongo 连接字符串来连接到集群。下面的示例打印出许多集群配置和指标:
keyhole --info "mongodb://user:secret@host.local/test?replicaSet=rs"
如果从连接字符串中省略密码字段,keyhole 将提示输入密码。例如:
keyhole --info "mongodb://user@host.local/test?replicaSet=rs" Enter Password:
Load Tests with Random Data
-
默认情况下,Keyhole 负载测试运行 5 分钟,分为三个不同阶段:initialization, thrashing, and teardown.
- Initialization: 以一致的速率将文档插入 mongo 集群以测量集群吞吐量。这也会填充内存和wiredTiger缓存中的数据。
- Thrashing: 结合CRUD操作(create\read\update\delete)和聚合查询来衡量数据库操作时间。
- Teardown: 批量删除文档。
-
要开始负载测试,请使用连接字符串执行 keyhole 命令。有许多参数定义你的负载测试配置:
- –duration:以分钟为单位定义测试的长度
- –conn:定义并发连接数
- –tps:定义每秒事务数
- –tx:在文件中定义自定义交易
-
有关负载测试的其他详细信息可从 wiki 的负载测试部分获得(Home · simagix/keyhole Wiki (github.com))。我通常运行两个负载测试:一个在副本集的主节点上执行(或在托管 mongos 的服务器上),另一个在其中一个应用程序服务器上执行。从结果中,我们可以比较网络延迟的开销。以下是示例输出:
keyhole "mongodb://user@host.local/test?replicaSet=rs" 2019/11/25 09:10:39 Duration in minute(s): 5 2019/11/25 09:10:42 Total TPS: 300 (tps) * 10 (conns) = 3000, duration: 5 (mins) ... 2019/11/25 09:11:13 [replset] Storage: 665.3 -> 982.2, rate: 31.7 MB/sec 2019/11/25 09:11:14 [replset] replication lags: - localhost:27018: 7 - localhost:27019: 3 2019/11/25 09:11:14 [replset] Memory - resident: 776, virtual: 6240, page faults: 0, iops: 1815.1 2019/11/25 09:11:14 [replset] CRUD+ - insert: 361900, find: 1, update: 58, delete: 0, getmore: 775, command: 818 2019/11/25 09:11:14 [replset] Latency- read: 0.5, write: 2.5, command: 0.5 (ms) ... 2019/11/25 09:12:43 Average Executions Time (including network latency): 2019/11/25 09:12:43 [ Ping] 1.049222ms 2019/11/25 09:12:43 [ InsertMany] 6.742749ms 2019/11/25 09:12:43 [ FindOne] 3.091258ms 2019/11/25 09:12:43 [ Find] 3.231524ms 2019/11/25 09:12:43 [ UpdateOne] 3.894997ms 2019/11/25 09:12:43 [ UpdateMany] 4.143732ms 2019/11/25 09:12:43 [ DeleteOne] 3.797362ms 2019/11/25 09:12:43 [ DeleteMany] 4.94698ms ... <server status summaries> ... 2019/11/25 09:15:44 stats written to ./keyhole_stats.2019-11-25T091039-replset.gz
从输出中,您可以了解集群写入吞吐量(从上述示例输出的第 5 行开始为 31.7 MB/秒)、读/写延迟以及在压力情况下复制滞后。在测试结束时,将打印摘要(来自上述输出)并保存到文件中。保留文件以备将来参考。 Keyhole 能够使用 --diag 标志读回文件并提供文本摘要。它还可以通过额外的 --web 标志向 Grafana 提供数据馈送。
Load Tests With Customer Data
-
默认情况下,keyhole 会在将文档发送到 mongo 服务器之前生成随机文档。为了使用客户的文档结构进行更真实的测试,包含 --file 标志和 keyhole 将生成随机文档,其数据类型与提供的 JSON 文档中的所有字段的数据类型相同。您将首先使用以下命令创建一个包含 JSON 文档的文件,例如,命名.users 中的 users.json 文件:
mongo "mongodb://user:xxx@host.local/example?replicaSet=rs&authSource=admin" \ --eval 'db.users.findOne()' > users.json
然后,按以下方式执行负载测试:
keyhole --file users.json "mongodb://user@host.local/test?replicaSet=rs"
Existing Cluster Health Check
-
对于现有的 mongo 集群,Keyhole 会收集其他信息来评估集群性能。
-
Keyhole 使用 --info 和 -v 参数收集其他配置和统计信息。包含所有收集信息的 JSON 文档被写入一个 gzip 文件。
keyhole -v --info "mongodb://user@host.local/test?replicaSet=rs" JSON is written to host.local.json.gz
-
解压缩文件并在浏览器中查看文件。您将在下面找到信息:
-
cluster: standalone, replica or sharded # 集群:独立、副本或分片
-
config: cluster configurations details # config:集群配置详情
-
buildInfo # 构建信息
-
getCmdLineOpts # 获取命令行选项
-
hostInfo # 主机信息
-
replSetGetStatus # 复制设置获取状态
-
rolesInfo # 角色信息
-
serverStatus #服务器状态
-
usersInfo # 用户信息
-
-
databases: # 数据库
- DB: database name # DB:数据库名称
- collections: an array of collection information # collections:集合信息的数组
- NS: namespace # NS:命名空间
- collection: collection name # 集合:集合名称
- document: a sample document # 文档:示例文档
- indexes: all indexes of the collection and duplicate index removal recommendations # 索引:集合的所有索引和重复索引删除建议
- stats: storage stats # stats:存储统计
-
host: hostname # 主机:主机名
-
process: connected process: mongod or mongos # 进程:连接进程:mongod 或 mongos
-
sharding: sharding info if applicable # 分片:分片信息(如果适用)
-
storage # 贮存
- databases: an array of database storage stats # 数据库:一组数据库存储统计信息
- totalDataSize (MB): total data size, # totalDataSize (MB):总数据大小,
- totalIndexSize (MB): total index size # totalIndexSize (MB):索引总大小
-
version: MongoDB version # 版本:MongoDB 版本
-
Generate HTML Summary Report
-
可以使用Maobi(毛笔) Docker 镜像生成 HTML 报告,这是为 Keyhole 创建的 HTML 报告生成工具。
-
生成的报告显示了你的 MongoDB 集群的统计信息和配置,其中有两个我特别感兴趣的统计信息。第一个统计信息是确保您的索引完全适合 RAM,以便服务器可以避免从磁盘读取索引。这是通过将存储下的总索引大小与系统内存(服务器信息下的 system.memSizeMB)进行比较来完成的。以下是存储部分的示例:
和服务器信息部分:
另一种是检查每个集合下的索引重复和用法。删除冗余和未使用的索引可提高写入性能。
-
出于明显的读取性能改进原因,开发人员喜欢创建索引。但是存在一些从未使用过或重复的索引,因为它们是其他索引的前缀。以下是生成的 HTML 摘要报告的示例:
可以删除标有 ✘ 的索引,因为另一个现有的复合索引也可以覆盖它。应评估标有 ❓ 的索引,因为自 MongoDB 服务器上次启动以来它从未使用过。
Keyhole 还可以通过执行命令来显示索引使用情况,并可信地标记要评估的索引(使用 ❓ 前缀)或删除(使用 ✘ 前缀)。例如:
keyhole --index "mongodb://user@host.local/test?replicaSet=rs" test.numbers: { _id: 1 } host: host.local:27017, ops: 123,456, since: 2019-11-13 14:48:04.473 +0000 UTC x { a: 1 } host: host.local:27017, ops: 0, since: 2019-11-13 14:48:04.473 +0000 UTC x { a: 1, b: 1 } host: host.local:27017, ops: 0, since: 2019-11-13 14:48:04.473 +0000 UTC { a: 1, b: 1, c: 1 } host: host.local:27017, ops: 54,168, since: 2019-11-13 14:48:04.473 +0000 UTC ? { region: 1 } host: host.local:27017, ops: 0, since: 2019-11-13 14:48:04.473 +0000 UTC
如果本文对您的工作学习有帮助,请您点一个免费的赞,您的鼓励是我继续创作的动力!