2013-07-15 16:13:05

MongoDB数据库监控

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()

集群和分片监控在后面介绍

发表回复