1. Redis查看慢查询:
Redis 的慢查询日志功能用于记录执行时间超过给定时长的命令请求, 用户可以通过这个功能产生的日志来监视和优化查询速度。
服务器配置有两个和慢查询日志相关的选项:
slowlog-log-slower-than 选项指定执行时间超过多少微秒(1 秒等于 1,000,000 微秒)的命令请求会被记录到日志上。
举个例子, 如果这个选项的值为 100 , 那么执行时间超过 100 微秒的命令就会被记录到慢查询日志; 如果这个选项的值为 500 , 那么执行时间超过 500 微秒的命令就会被记录到慢查询日志; 诸如此类。
slowlog-max-len 选项指定服务器最多保存多少条慢查询日志。
服务器使用先进先出的方式保存多条慢查询日志: 当服务器储存的慢查询日志数量等于 slowlog-max-len 选项的值时, 服务器在添加一条新的慢查询日志之前, 会先将最旧的一条慢查询日志删除。
举个例子, 如果服务器 slowlog-max-len 的值为 100 , 并且假设服务器已经储存了 100 条慢查询日志, 那么如果服务器打算添加一条新日志的话, 它就必须先删除目前保存的最旧的那条日志, 然后再添加新日志。
让我们来看一个慢查询日志功能的例子, 首先用 CONFIG_SET 命令将 slowlog-log-slower-than 选项的值设为 0 微秒, 这样 Redis 服务器执行的任何命令都会被记录到慢查询日志中, 接着将 slowlog-max-len 选项的值设为 5 , 让服务器最多只保存 5 条慢查询日志:
redis> CONFIG SET slowlog-log-slower-than 0
OK
redis> CONFIG SET slowlog-max-len 5
OK
接着, 我们用客户端发送几条命令请求:
redis> SET msg "hello world"
OK
redis> SET number 10086
OK
redis> SET database "Redis"
OK
然后使用 SLOWLOG GET 命令查看服务器所保存的慢查询日志:
redis> SLOWLOG GET
1) 1) (integer) 4 # 日志的唯一标识符(uid)
2) (integer) 1378781447 # 命令执行时的 UNIX 时间戳
3) (integer) 13 # 命令执行的时长,以微秒计算
4) 1) "SET" # 命令以及命令参数
2) "database"
3) "Redis"
2. 使用Profiling捕捉MongoDb慢查询
返回最近的10条记录
db.system.profile.find().limit(10).sort({ts:-1}).pretty()
返回所有的操作,除command类型的
db.system.profile.find({op: {$ne:'command'}}).pretty()
返回特定集合
db.system.profile.find({ns:'mydb.test'}).pretty()
返回大于5毫秒慢的操作
db.system.profile.find({millis:{$gt:5}}).pretty()
从一个特定的时间范围内返回信息
db.system.profile.find(
{
ts : {
$gt : new ISODate("2015-10-18T03:00:00Z"),
$lt : new ISODate("2015-10-19T03:40:00Z")
}
}
).pretty()
特定时间,限制用户,按照消耗时间排序
db.system.profile.find({
ts : {
$gt : newISODate("2015-10-12T03:00:00Z") ,
$lt : newISODate("2015-10-12T03:40:00Z")
}
},
{ user : 0 }
).sort( { millis : -1 } )
查看最新的 Profile 记录:
db.system.profile.find().sort({$natural:-1}).limit(1)
显示5个最近的事件
show profile
查看mongodb运行状态
db.serverStatus()
PRIMARY> db.serverStatus()
{
"host" : "cd9a511a2d0e", #主机名
"version" : "2.6.1", ,#版本号
"process" : "mongod", #进程名
"pid" : NumberLong(41), #进程ID
"uptime" : 3785943, #运行时间
"uptimeMillis" : NumberLong("3785942955"),
"uptimeEstimate" : 3755878,
"localTime" : ISODate("2015-10-16T02:46:27.368Z"), #当前时间
"asserts" : { #各个断言的数量
"regular" : 0,
"warning" : 0,
"msg" : 0,
"user" : 58,
"rollovers" : 0
},
"backgroundFlushing" : {
"flushes" : 63098, #刷新次数
"total_ms" : 144997713, #刷新花费总时间
"average_ms" : 2297.97637009097, #平均时间
"last_ms" : 10913, #最后一次时间
"last_finished" : ISODate("2015-10-16T02:45:40.363Z") #最后刷新时间
},
"connections" : {
"current" : 1444, #当前连接数
"available" : 18556, #可用连接数
"totalCreated" : NumberLong(2429949)
},
"cursors" : {
"note" : "deprecated, use server status metrics",
"clientCursors_size" : 1, #客户端游标大小
"totalOpen" : 1, #打开游标数
"pinned" : 0,
"totalNoTimeout" : 481,
"timedOut" : 84 #超时时间
},
"dur" : {
"commits" : 27,
"journaledMB" : 2.711552,
"writeToDataFilesMB" : 5.213888,
"compression" : 0.5158220112430492,
"commitsInWriteLock" : 0,
"earlyCommits" : 0,
"timeMs" : {
"dt" : 3003,
"prepLogBuffer" : 1,
"writeToJournal" : 228,
"writeToDataFiles" : 10,
"remapPrivateView" : 2
}
},
"extra_info" : {
"note" : "fields vary by platform",
"heap_usage_bytes" : 96529464, #堆使用情况(字节)
"page_faults" : 11253067 #页面故障数
},
"globalLock" : {
"totalTime" : NumberLong("3785942955000"),
"lockTime" : NumberLong("47441423960"),
"currentQueue" : {
"total" : 0,
"readers" : 0,
"writers" : 0
},
"activeClients" : {
"total" : 0,
"readers" : 0,
"writers" : 0
}
},
"indexCounters" : {
"accesses" : 5980339643, #索引被访问数
"hits" : 5980339322, #索引命中数
"misses" : 0, #索引偏差数
"resets" : 0, #复位数
"mi***atio" : 0 #未命中率
},
"locks" : {
"." : {
"timeLockedMicros" : {
"R" : NumberLong(1300731481),
"W" : NumberLong("47441423960")
},
"timeAcquiringMicros" : {
"R" : NumberLong("83350794378"),
"W" : NumberLong("8842280365")
}
},
},
"network" : {
"bytesIn" : 182494603618, #输入数据(byte)
"bytesOut" : NumberLong("2936449550300"), #输出数据(byte)
"numRequests" : 600302443 #请求数
},
"opcounters" : {
"insert" : 214538892, #插入操作数
"query" : 388689, #查询操作数
"update" : 3462611, #更新操作数
"delete" : 0, ,#删除操作数
"getmore" : 188590632, #获取更多的操作数
"command" : 197825527 #其他命令操作数
},
"opcountersRepl" : {
"insert" : 1,
"query" : 0,
"update" : 0,
"delete" : 0,
"getmore" : 0,
"command" : 0
},
"recordStats" : {
"accessesNotInMemory" : 8377141,
"pageFaultExceptionsThrown" : 2926497,
"admin" : {
"accessesNotInMemory" : 94,
"pageFaultExceptionsThrown" : 0
}
},
"repl" : { #复制情况
"setName" : "c562ca6c-1d72-4c6a-a943-b46fe87e47ca",
"setVersion" : 105039,
"ismaster" : true,
"secondary" : false,
"hosts" : [
"10.10.1.1:27017",
"10.10.1.2:27017"
],
"arbiters" : [
"10.10.1.2:27017"
],
"primary" : "10.10.1.4:27017",
"me" : "10.10.1.5:27017"
},
"writeBacksQueued" : false,
"mem" : { #内存情况
"bits" : 64, #64位操作系统
"resident" : 4430, #占有物理内存数
"virtual" : 813370, #占有虚拟内存数
"supported" : true, #是否支持内存扩展
"mapped" : 405498,
"mappedWithJournal" : 810996
},
"metrics" : {
"cursor" : {
"timedOut" : NumberLong(84),
"open" : {
"noTimeout" : NumberLong(481),
"pinned" : NumberLong(0),
"total" : NumberLong(1)
}
},
"document" : {
"deleted" : NumberLong(0),
"inserted" : NumberLong(214538892),
"returned" : NumberLong("6735629965"),
"updated" : NumberLong(6502807)
},
"getLastError" : {
"wtime" : {
"num" : 0,
"totalMillis" : 0
},
"wtimeouts" : NumberLong(0)
},
"operation" : {
"fastmod" : NumberLong(3483995),
"idhack" : NumberLong(39),
"scanAndOrder" : NumberLong(6)
},
"queryExecutor" : {
"scanned" : NumberLong(107218344),
"scannedObjects" : NumberLong(107217952)
},
"record" : {
"moves" : NumberLong(1604)
},
"repl" : {
"apply" : {
"batches" : {
"num" : 2,
"totalMillis" : 8
},
"ops" : NumberLong(1)
},
"buffer" : {
"count" : NumberLong(0),
"maxSizeBytes" : 268435456,
"sizeBytes" : NumberLong(0)
},
"network" : {
"bytes" : NumberLong(709),
"getmores" : {
"num" : 18,
"totalMillis" : 86108
},
"ops" : NumberLong(2),
"readersCreated" : NumberLong(35)
},
"preload" : {
"docs" : {
"num" : 0,
"totalMillis" : 0
},
"indexes" : {
"num" : 1,
"totalMillis" : 0
}
}
},
"storage" : {
"freelist" : {
"search" : {
"bucketExhausted" : NumberLong(0),
"requests" : NumberLong(6551285),
"scanned" : NumberLong(12001208)
}
}
},
"ttl" : {
"deletedDocuments" : NumberLong(0),
"passes" : NumberLong(63048)
}
},
"ok" : 1
}
需要关心的地方:
1、 connections当前连接和可用连接数,听过一个同行介绍过,mongodb最大处理到2000个连接就不行了(要根据你的机器性能和业务来设定),所以设大了没意义。设个合理值的话,到达这个值mongodb就拒绝新的连接请求,避免被太多的连接拖垮。
2 、 indexCounters:btree:misses索引的不命中数,和hits的比例高就要考虑索引是否正确建立。
查看连接数
db.serverStatus().connections
获取当前数据库的信息,比如Obj总数、数据库总大小、平均Obj大小等
db.stat()
SECONDARY> db.stats()
{
"db" : "onroad", #库名
"collections" : 9, #集合数
"objects" : 130751421, // 记录在数据库中的所有文档总数
"avgObjSize" : 559.257981907516, // 数据库中所有文档的平均大小,等于 dataSize/objects
"dataSize" : 73123775840, // 数据库所有文档的总大小,以字节为单位 ---> 73G
"storageSize" : 80531728032, // 分配给每一个文档的磁盘空间
"numExtents" : 162, ,#事件数
"indexes" : 14, #索引数
"indexSize" : 19496636768, #索引大小
"fileSize" : 332680921088, #文件大小
"nsSizeMB" : 16, #命名空间文件的大小
"dataFileVersion" : { #包含 数据库文件的磁盘格式信息 的文档
"major" : 4, #主要版本号的 磁盘格式数据库的数据文件
"minor" : 5 #次要版本号
},
"extentFreeList" : {
"num" : 436,
"totalSize" : 229138838864
},
"ok" : 1
}