keyhole操作文档#功能概述Part1

Keyhole操作文档

简介

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
    

如果本文对您的工作学习有帮助,请您点一个免费的赞,您的鼓励是我继续创作的动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值