监控与性能
约 618 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › MongoDB › 运维与安全(在新窗口打开) › 监控与性能
mongostat
# 实时监控(每秒输出)
mongostat
# 指定间隔
mongostat --rowcount 10 5 # 5 秒间隔,输出 10 次
# 输出示例
# insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn
# 0 20 10 2 1 50 2.1 55.0 0 1.2G 512M 0|0 1|0 2.0k 10.0k 25关键指标
| 字段 | 含义 |
|---|---|
insert/query/update/delete | 每秒操作数 |
dirty | WiredTiger 脏页比例(应 < 20%) |
used | WiredTiger 缓存使用比例 |
vsize | 虚拟内存 |
res | 物理内存 |
qrw | 操作队列数(读写,应接近 0) |
arw | 活跃读/写客户端数 |
conn | 当前连接数 |
mongotop
# 查看每个集合的读写时间
mongotop 5 # 5 秒间隔
# 输出示例
# ns total read write
# mydb.users 15ms 2ms 13ms
# mydb.orders 42ms 1ms 41msserverStatus
// 数据库运行状态
db.serverStatus()
// 连接数
db.serverStatus().connections
// { "current": 25, "available": 475, "totalCreated": 1000 }
// 内存使用
db.serverStatus().mem
// { "resident": 512, "virtual": 2048, "mapped": 1024 }
// 操作计数
db.serverStatus().opcounters
// { "insert": 1000, "query": 5000, "update": 2000, "delete": 500, ... }
// WiredTiger 缓存
db.serverStatus().wiredTiger.cache
// "bytes currently in the cache" # 缓存中数据量
// "maximum bytes configured" # 缓存上限
// "percentage dirty" # 脏页比例currentOp / killOp
// 查看当前正在执行的操作
db.currentOp()
// 查找长时间运行的查询(超过 5 秒)
db.currentOp({
"active": true,
"secs_running": { "$gt": 5 }
})
// 终止操作
db.killOp(opid)profiling
// 开启慢查询日志
db.setProfilingLevel(1, { slowms: 200 }) // 记录超过 200ms 的查询
// 关闭
db.setProfilingLevel(0)
// 查看所有 profiling 级别
// 0 - 关闭
// 1 - 记录慢查询
// 2 - 记录所有操作
// 查看慢查询
db.system.profile.find().sort({ ts: -1 }).limit(10).pretty()
// 分析最慢的查询
db.system.profile.find().sort({ millis: -1 }).limit(5).pretty()性能建议
// 1. 确保查询使用索引(explain 检查)
// 2. 使用 projection 限制返回字段
db.users.find({ status: "active" }, { name: 1, email: 1 })
// 3. 批量操作代替逐条操作
db.users.insertMany([...]) // 代替 insertOne 循环
db.users.bulkWrite([...]) // 混合批量
// 4. 避免大规模 skip
// 使用基于 _id 的游标分页
db.users.find({ _id: { $gt: lastId } }).limit(20)
// 5. 监控 WiredTiger 缓存命中率
db.serverStatus().wiredTiger.cache小结
mongostat实时查看操作数和缓存状态,mongotop查看集合级别的读写耗时。db.serverStatus()查看连接数、内存、操作计数、WiredTiger 缓存。db.currentOp()/db.killOp()管理和终止长时间运行的操作。- 开启 profiling 记录慢查询,结合 explain 分析优化。
- 性能优化:建索引、用 projection、批量操作、游标分页。
上一节:备份与恢复
