Mongodb监控包括操作系统层面和数据库层面监控
1.1 操作系统层面:
1.1.1 TOP命令
监控进程硬件资源使用情况:
[mongo_2 ~]# pidof mongod --获取mongod和配置服务器进程号 20350 20244 20183 19155 [mongo_2 ~]# pidof mongos --获取路由进程号 20366 [mongo_2 ~]# top -p 20350,20244,20183,19155,20366 --top命令输出结果 top - 11:01:02 up 5 days, 22:46, 5 users, load average: 0.26, 0.17, 0.07 Tasks: 5 total, 0 running, 5 sleeping, 0 stopped, 0 zombie Cpu(s): 0.4%us, 0.5%sy, 0.0%ni, 98.8%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 3924572k total, 3806340k used, 118232k free, 176096k buffers Swap: 6291448k total, 67488k used, 6223960k free, 434284k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20244 root 20 0 47.0g 262m 134m S 2.0 6.8 69:28.20 mongod 20350 root 20 0 540m 55m 25m S 0.0 1.4 78:24.18 mongod 20183 root 20 0 50.9g 118m 53m S 0.0 3.1 82:21.28 mongod 19155 root 20 0 41.0g 348m 143m S 0.0 9.1 56:11.06 mongod 20366 root 20 0 325m 14m 3724 S 0.0 0.4 48:48.40 mongos
命令结果说明:
信息统计区:
系统运行了5天,22小时46分,现在有5个终端连接。
load average是任务队列的平均长度,三个值分别是最近1分钟,5分钟,15分钟到现在的平均值。
第二行是任务信息,表示目前统计了5个进程,5个进程都在睡眠状态。
第三行是CPU信息,表示各种对象使用的cpu时间百分比,多cpu可能有多行信息:
Us:用户空间占用cpu百分比
Sy:内核空间占用cpu百分比
Ni:改变过优先级的进程占用的cpu百分比
Id:CPU空闲率
Wa: 等待输入输出的CPU时间百分比
Hi,Si,St: 处理hi( Hardware IRQ)cpu,si(Software Interrupts),st(Steal Time)的时间比
第三、四行:内存信息对于操作系统而言,可用内存是free值,对于进程而言,可用内存则是free+buffers+cached。一般需要着重关注的是swap used,如果这个值在不断变动,那说明有很多的内存页面换入换出,系统存在性能问题。
进程信息区:
Pid:进程号
User:运行进程的用户
PR:进程优先级:如果没有特别指明,一般用户进程都是20
NI:进程NICE值,这个值会影响PR,对于Linux取值范围一般是-20到19,值越大,PR的值随之越高,那么进程更优先获取CPU调度。
VIRT:进程映射的虚拟内存大小,这个值和数据库文件大小有关
RES:进程物理内存占有
SHR:进程的共享内存占有
S:进程状态
%CPU:上次更新到现在进程cpu占有百分比
%MEM:进程物理内存占有百分比
Time+:进程使用cpu的总时间
COMMAND:启动进程的命令
Top命令能反映整体状况,也能反应个进程状态,但是磁盘操作情况看不到,可以用vmstat命令作补充:
1.1.2 Vmstat
[mongo_2 ~]# vmstat 2 --每2s刷新一次 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 70896 125416 165772 428456 0 0 0 47 2 9 0 1 99 0 0 7 1 70896 123920 165776 429288 0 0 96 2136 13155 16303 17 14 68 2 0 1 0 70896 123176 165780 430240 0 0 94 2408 14418 17764 19 15 65 1 0 0 1 70892 122060 165784 432040 4 0 80 2854 14063 17483 18 14 64 3 0 1 0 70892 121812 165788 432540 0 0 96 4674 8891 10957 12 10 76 3 0 4 0 70892 121812 165788 433028 0 0 64 1710 7639 9884 8 6 84 1 0 1 0 70892 119952 165792 433668 0 0 64 2060 10685 13675 12 10 76 1 0 4 0 70892 119456 165792 434464 0 0 34 1676 9813 12508 12 9 76 3 0 0 0 70892 120200 165792 435144 0 0 64 1558 6382 8423 7 6 86 1 0 0 0 70892 119704 165792 435400 0 0 0 1168 3638 5234 3 3 94 1 0 1 0 70892 118340 165796 436036 0 0 96 1586 7341 9778 6 5 87 1 0
Procs(进程):
R:运行队列中的进程数量
B:等待I/O的进程数量
Memory:
swpd: 使用虚拟内存大小,如果这个值在波动,说明系统有性能问题的
free: 可用内存大小(对操作系统而言)
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
swap(交换内存)
Swap:
si: 每秒从交换区写到内存的大小
so: 每秒写入交换区的内存大小
IO:(Linux版本块大小为1024bytes)
bi: 每秒读取的数据块数
bo: 每秒写入的数据块数
系统:
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
CPU(以百分比表示):
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间
wa: 等待IO时间
出现性能问题:例如内存上涨,可以看到交换内存波动,cpu使用率上升,可以看到us可能值比较大,id值变小。
1.2 数据库层面
1.2.1 Mongotop
这个命令可以在集合和数据库级别,跟踪哪些时间花费在哪些对象的读和写上。
由于路由进程一般不存放数据,这个命令一般只能用于mongod进程
ns total read write 2013-07-15T08:52:15 testdata.testdata 24ms 24ms 0ms local.replset.minvalid 11ms 0ms 11ms random.$cmd 0ms 0ms 0ms local.system.users 0ms 0ms 0ms local.system.replset 0ms 0ms 0ms local.system.namespaces 0ms 0ms 0ms local.system.indexes 0ms 0ms 0ms [mongo_2 ~]# mongotop --port 10000 --locks connected to: 127.0.0.1:10000 db total read write 2013-07-15T08:58:51 testdata 79ms 30ms 49ms local 15ms 0ms 15ms . 5ms 1ms 4ms testdb 0ms 0ms 0ms test 0ms 0ms 0ms random 0ms 0ms 0ms hxdb 0ms 0ms 0ms admin 0ms 0ms 0ms
1.2.2 Mongostat
这个命令用于追踪数据库实例的实时运行状况,是一个十分重要的命令。类似Linux的vmstat命令。
[mongo_2 ~]# mongostat --port 30000 mongostat --discover --port=30000(是个选项可以发现集群中的副本集机器) connected to: 127.0.0.1:30000 insert query update delete getmore command vsize res faults netIn netOut conn repl time 1000 0 0 0 0 21 329m 12m 0 254k 4k 6 RTR 17:03:03 750 0 0 0 0 16 329m 12m 0 190k 3k 6 RTR 17:03:04 1000 0 0 0 0 20 329m 12m 0 254k 4k 6 RTR 17:03:05 1000 0 0 0 0 21 329m 12m 0 254k 4k 6 RTR 17:03:06 950 0 0 0 0 21 329m 12m 0 241k 4k 6 RTR 17:03:07 [mongo_2 ~]# mongostat --port 10000 connected to: 127.0.0.1:10000 insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn set repl time *1000 *0 *0 *0 0 4|0 0 27.2g 55.3g 745m 2 testdata:8.4% 0 0|0 0|0 314b 4k 18 sh0 SEC 17:03:11 *1000 *0 *0 *0 0 8|0 0 27.2g 55.3g 745m 1 testdata:5.3% 0 0|0 0|0 562b 7k 18 sh0 SEC 17:03:12 *981 *0 *0 *0 0 2|0 0 27.2g 55.3g 747m 1 testdata:5.4% 0 0|0 0|0 190b 3k 18 sh0 SEC 17:03:13
说明
前面的RTR表示这个实例是一个路由进程:
Insert:每秒执行的插入操作操作
Query:每秒执行的查询操作次数
Delete:每秒执行的删除操作次数。
Getmore:查询时游标的getmore操作
Flush:1s内的flush次数,值为0或者1,通过检查两次1之间的时间就可以判断flush时间间隔。时间间隔太短,I/O频繁,系统性能会降低。时间间隔较长,则需要更多的内存空间和journal日志空间。
Mapped,vsize,res:
这三个和用top看到的差不多,mapped指的是数据文件映射的虚拟内存空间大小,和数据库大小有关。vsize指的是总共映射的虚拟地址空间, res就是实际占用的物理内存,如果res经常突然下降,得看看是否有别的程序在抢内存。
Faults:
每s里的内存页错误,大压力下这个数值往往不为0。如果经常不为0,那就该加内存了。
Locked:
MongoDB就一把读写锁,这里指的是写锁所住的时间百分比。这个数值过大(经常超过10%),那就是出状况了。
locked db:表示某个数据库锁在全局锁中的百分比。
idx miss:
正常情况下,多数的查询都应该走索引,也就是说idx miss为0。如果这里数值较大,那就是有很多查询没走索引了。
qr|qw: queue lengths for clients waiting (read|write):等待中的客户端读写操作,如果这里太大,说明db响应不及时了。
ar|aw: active clients (read|write):表示当前活动的客户端读写操作量。
netIn: network traffic in - bits
netOut: network traffic out - bits
网络带宽压力,一般MongoDB,网络不会成为瓶颈
conn: number of open connections
MongoDB为每一个连接创建一个线程,线程的创建和释放也是有开销的。尽量不要让这个数值很大。
Repl: 服务器当前状态(只考虑RS集群)
PRI - master
SEC - secondary
REC - recovering
UNK - unknown
1.2.3 Mongo shell下的常用监测命令:
实例状态信息:
db.serverStatus()
集合信息:
db.printCollectionStats()
集群和分片监控在后面介绍