dstat是一个python开源的实时监控工具,一般是用来做系统性能监控的。咱们这里只是提他的自定义插件开发,用来打造自己的dstat。 有朋友可能还没清楚是什么意思, 咱们查看系统的状体状态有人喜欢用vmstat,也有人喜欢用dstat。
相比来说dstat的功能模块更全一点是,这里还只是说查看系统性能方面的 ! 如果想一边查看,系统的各方面性能指标,还想看你应用的一些个负载相关,比如某个程序的负载,mongodb的锁lock百分比,mysql连接数... 懂了吧 !
下面是dstat的插件,这些组件基本是python开发。大家可以随便找个脚本看看。一开始在官网找相关的文档,就那几百行的文档,没看懂,这次真不是我英语不行,是他们真没说明白, 我还看到很多人提了issue,也是在问怎么搞扩展。 在官网没找到思路后,我直接看dstat的源码,然后找了个例子,原来是如此的简单。
你传递的参数,他会引入模块,引入的合适的格式 dstat_innodb_io.py ,他会匹配引入模块,然后调用模块 。
当然这类似dstat、vmstat的工具,我们自己也能做,但dstat的性能统计信息已经完整了,就没必要重新自己写一套了 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
原文:http:
//rfyiamcool
.blog.51cto.com
/1030776/1430966
[root@66 dstat]
# pwd
/usr/share/dstat
[root@66 dstat]
# ls
dstat_battery.py dstat_innodb_io.py dstat_nfs3_ops.pyo dstat_sendmail.pyo dstat_top_oom.pyo
dstat_battery.pyo dstat_innodb_io.pyo dstat_nfs3.py dstat_snooze.py dstat_utmp.py
dstat_battery_remain.py dstat_innodb_ops.py dstat_nfs3.pyo dstat_snooze.pyo dstat_utmp.pyo
dstat_battery_remain.pyo dstat_innodb_ops.pyo dstat_nfsd3_ops.py dstat_thermal.py dstat_vmk_hba.py
dstat_cpufreq.py dstat_lustre.py dstat_nfsd3_ops.pyo dstat_thermal.pyo dstat_vmk_hba.pyo
dstat_cpufreq.pyo dstat_lustre.pyo dstat_nfsd3.py dstat_top_bio.py dstat_vmk_int.py
dstat_dbus.py dstat_memcache_hits.py dstat_nfsd3.pyo dstat_top_bio.pyo dstat_vmk_int.pyo
dstat_dbus.pyo dstat_memcache_hits.pyo dstat_ntp.py dstat_top_cpu.py dstat_vmk_nic.py
dstat_disk_util.py dstat_mysql5_cmds.py dstat_ntp.pyo dstat_top_cpu.pyo dstat_vmk_nic.pyo
dstat_disk_util.pyo dstat_mysql5_cmds.pyo dstat_postfix.py dstat_top_cputime_avg.py dstat_vm_memctl.py
dstat_fan.py dstat_mysql5_conn.py dstat_postfix.pyo dstat_top_cputime_avg.pyo dstat_vm_memctl.pyo
dstat_fan.pyo dstat_mysql5_io.py dstat_power.py dstat_top_cputime.py dstat_vz_cpu.py
dstat_freespace.py dstat_mysql5_io.pyo dstat_power.pyo dstat_top_cputime.pyo dstat_vz_cpu.pyo
dstat_freespace.pyo dstat_mysql5_keys.py dstat_proc_count.py dstat_top_io.py dstat_vz_io.py
dstat_gpfs_ops.py dstat_mysql5_keys.pyo dstat_proc_count.pyo dstat_top_io.pyo dstat_vz_io.pyo
dstat_gpfs_ops.pyo dstat_mysql_io.py dstat.py dstat_top_latency_avg.py dstat_vz_ubc.py
dstat_gpfs.py dstat_mysql_io.pyo dstat.pyo dstat_top_latency_avg.pyo dstat_vz_ubc.pyo
dstat_gpfs.pyo dstat_mysql_keys.py dstat_rpcd.py dstat_top_latency.py dstat_wifi.py
dstat_helloworld.py dstat_mysql_keys.pyo dstat_rpcd.pyo dstat_top_latency.pyo dstat_wifi.pyo
dstat_helloworld.pyo dstat_net_packets.py dstat_rpc.py dstat_top_mem.py p-mem
dstat_innodb_buffer.py dstat_net_packets.pyo dstat_rpc.pyo dstat_top_mem.pyo
dstat_innodb_buffer.pyo dstat_nfs3_ops.py dstat_sendmail.py dstat_top_oom.py
|
首先来个简单的例子,我们想查看proc有多少个活动进程。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class
dstat_plugin(dstat):
"""
Total Number of processes on this system.
"""
def
__init__(
self
):
self
.name
=
'procs'
self
.
type
=
'd'
self
.width
=
4
self
.scale
=
10
self
.
vars
=
(
'total'
,)
def
extract(
self
):
self
.val[
'total'
]
=
len
(glob.glob(
'/proc/[0-9]*'
))
|
vars是显示的内容,val['total']是相对于vars的值。
我们来看个dstat 对于memcached的实时监控,这个需要你安装python memcahced模块包的,不然报错。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
### Author: Dean Wilson <dean.wilson@gmail.com>
class
dstat_plugin(dstat):
"""
Memcache hit count plugin.
Displays the number of memcache get_hits and get_misses.
"""
def
__init__(
self
):
self
.name
=
'Memcache Hits'
self
.
type
=
'd'
self
.width
=
6
self
.scale
=
50
self
.nick
=
(
'Hit'
,
'Miss'
)
self
.
vars
=
(
'get_hits'
,
'get_misses'
)
def
check(
self
):
try
:
global
memcache
import
memcache
self
.mc
=
memcache.Client([
'127.0.0.1:11211'
], debug
=
0
)
except
:
raise
Exception,
'Plugin needs the memcache module'
def
extract(
self
):
stats
=
self
.mc.get_stats()
for
key
in
self
.
vars
:
self
.val[key]
=
long
(stats[
0
][
1
][key])
~
|
其实主要是就两个点,一个是 vars是显示的名字,val[key]是值 。
再来一个mysql 连接数的例子,这个也是默认给的。系统首先会调用check函数,然后才会执行extract。这里的账号和密码,以及主机ip和端口都需要你自己变动的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
def
__init__(
self
):
self
.name
=
'mysql5 conn'
self
.
type
=
'f'
self
.width
=
4
self
.scale
=
1
self
.nick
=
(
'ThCon'
,
'%Con'
)
self
.
vars
=
(
'Threads_connected'
,
'Threads'
)
def
check(
self
):
global
MySQLdb
import
MySQLdb
try
:
self
.db
=
MySQLdb.connect(user
=
mysql_user, passwd
=
mysql_pwd)
except
Exception, e:
raise
Exception,
'Cannot interface with MySQL server, %s'
%
e
def
extract(
self
):
try
:
c
=
self
.db.cursor()
c.execute(
"""show global variables like 'max_connections';"""
)
max
=
c.fetchone()
c.execute(
"""show global status like 'Threads_connected';"""
)
thread
=
c.fetchone()
if
thread[
0
]
in
self
.
vars
:
self
.set2[thread[
0
]]
=
float
(thread[
1
])
self
.set2[
'Threads'
]
=
float
(thread[
1
]
/
float
(
max
[
1
])
1.0
*
100
)
for
name
in
self
.
vars
:
self
.val[name]
=
self
.set2[name]
*
1.0
/
elapsed
if
step
=
=
op.delay:
self
.set1.update(
self
.set2)
except
Exception, e:
for
name
in
self
.
vars
:
self
.val[name]
=
-
1
|
下面是我为自己扩展了一个方便自己查看性能指标的面板。 可以查看网速,线程连接数,最大连接数,进程数,redis的邮件队列。
原文:http://rfyiamcool.blog.51cto.com/1030776/1430966
dstat 有个小小的缺点,他自己没有多线程或者多进程的实现。这样会导致采集多个信息的时候,会有些慢。
vmstat和dstat虽然很有优秀,但是咱们的要求更高,更全面,那就请自己扩展插件吧。