CPU使用率过高的一般排查步骤如下:
- 使用控制台的【监测图表】的【cpu】这一标签,观察哪一时间段内cpu使用率出现过高。
- 登录对应的实例机器查看系统资源使用情况:首先使用Linux的系统监控工具(如top、htop)或Windows的任务管理器,查看系统整体的CPU使用率和其他资源使用情况。确认是否只有MongoDB进程占用大量CPU资源,还是其他进程也在竞争CPU资源。
- 文档数据库服务查询性能分析工具与方式:
- MongoDB Compass等工具来查看当前正在执行的查询(MongoDB Compass 的下载与使用移步Mongodb的官网下载)。
- 使用MongoDB shell 的db.currentOp()命令,检查是否有某个查询或操作占用了大量CPU资源。
db.currentOp()命令解析:
例如:连接上Mongodb shell 执行以下操作:
> db.users.find({ age: { $gte: 18 } }).limit(10)
> db.currentOp()
{
"inprog" : [
{
"opid" : 1290, // 操作的唯一标识符
"op" : "query", // 操作类型:查询
"ns" : "exampledb.users", // 操作涉及的命名空间
"query" : { "age" : { "$gte" : 18 } }, // 查询条件
"client" : "127.0.0.1:57852", // 客户端IP地址和端口
"desc" : "conn211", // 操作的描述信息
"active" : true, // 操作是否活动中
"secs_running" : 5, // 操作已经运行的时间(以秒为单位)
"oplog" : false,
"numYields" : 0,
"locks" : {
"Global" : "r", // 全局读锁
"MMAPV1Journal" : "r" // MMAPv1引擎的日志读锁
},
"waitingForLock" : false,
"msg" : "",
"numYieldOps" : 0,
"database" : "exampledb",
"command" : {
"find" : "users", // 执行的命令:查找操作
"filter" : { "age" : { "$gte" : 18 } }, // 过滤条件
"limit" : 10 // 限制结果数
},
"planSummary" : "COLLSCAN", // 查询执行计划摘要
"lsid" : {
"id" : { "UUID" : "e45ea917-6c61-4a5e-8681-2da4af89aa29" }, // 会话ID
"uid" : ObjectId("ea6a1a2570a062f88eac10f5") // 用户ID
},
"$clusterTime" : { "clusterTime" : Timestamp(1657796621, 1), "signature" : { "hash" : { "BsonData" : "wDUTByvnZXjN+MJB/M9Rlg==", "Length" : 28 }, "keyId" : 6963168194386045953 } },
"stale" : false,
"txnNumber" : 11,
"startAt" : ISODate("2023-07-21T15:57:01.246Z"),
"autocommit" : false,
"lastWrite" : { "opTime" : { "ts" : Timestamp(1657796621, 1), "t" : 1 }, "lastWriteDate" : ISODate("2023-07-21T15:57:01Z"), "majorityOpTime" : { "ts" : Timestamp(1657796621, 1), "t" : 1 }, "majorityWriteDate" : ISODate("2023-07-21T15:57:01Z") },
"activeShards" : {},
"numShards" : 0,
"shardName" : "",
"hashed" : false,
"batchSize" : 0,
"mode" : "scanned"
}
]
}
- 确认索引使用情况:检查数据库中的索引是否被有效使用。缺少索引或索引使用不当可能导致查询性能下降,从而导致高CPU使用率。
- 长时间运行的查询:检查是否有长时间运行的查询,这些查询可能会占用大量CPU资源。优化查询性能或者对长时间运行的查询进行调整可能有助于降低CPU使用率。
- 调整Write Concern:写操作的Write Concern设置会影响数据写入的确认方式,使用较高级别的Write Concern可能会导致CPU开销增加。根据应用需求,选择合适的Write Concern。
- 硬件性能:确认文档数据库运行在性能良好的硬件上,包括CPU、内存和磁盘。如果硬件性能不足,可能会导致CPU使用率过高。
- 日志记录级别:考虑降低文档数据的日志记录级别,减少日志输出对CPU的影响。
- 压力测试:进行压力测试以模拟生产环境的负载,并观察CPU使用率的变化。通过压力测试可以更好地理解系统的瓶颈和性能问题。
- 数据分片:如果数据量较大,可以考虑使用文档数据库服务的分片集群,将数据分散到多个节点上,以实现水平扩展和负载均衡。
- 数据库版本和配置:确保使用的文档数据库服务版本是较新的稳定版本,并根据硬件资源和负载情况合理配置文档数据库服务的参数。
注意高CPU使用率可能是复杂的问题,可能有多个因素共同导致。在进行问题排查时,建议先在测试环境中进行实验和测试,逐步排查可能的原因。如果问题持续存在,可以考虑寻求专业的文档数据库技术支持。