前几天看到朋友郑彦生分享的psutil模块的使用方法,感觉对于监控又多了一层想法,因为前期主要是通过saltstack,收集数据,但是有时候比较麻烦,在小型规模做监控的时候还是建议用psutil模块,方便快捷:首先介绍psutil模块的一些基本用法:
1、监控cpu:
>>> import psutil
>>> psutil.cpu_count() #查看线程
24
>>> psutil.cpu_percent() #查看cpu负载
0.20000000000000001
2、查看内存相关信息:
内存可以查看总共多少内存,使用了多少,还剩多少:
>>> mem = psutil.virtual_memory()
#统计所有的信息
>>> mem
svmem(total=67502866432L, available=61983199232L, percent=8.1999999999999993, used=7092293632L, free=60410572800L, active=5551243264, inactive=410374144, buffers=335728640L, cached=1236897792)
>>> mem.total #内存总数
67502866432L
>>> mem.used #使用了多少内存
7092293632L
>>> mem.free #剩余内存
60410572800L
3、硬盘的IO和使用情况:
#输出硬盘分区信息
>>> psutil.disk_partitions()
[sdiskpart(device='/dev/mapper/VolGroup-lv_root', mountpoint='/', fstype='ext4', opts='rw'), sdiskpart(device='/dev/sda3', mountpoint='/boot', fstype='ext4', opts='rw'), sdiskpart(device='/dev/mapper/VolGroup-lv_home', mountpoint='/home', fstype='ext4', opts='rw')]
#根据分区信息查看大小
>>> psutil.disk_partitions('/')
[sdiskpart(device='/dev/mapper/VolGroup-lv_root', mountpoint='/', fstype='ext4', opts='rw'), sdiskpart(device='proc', mountpoint='/proc', fstype='proc', opts='rw'), sdiskpart(device='sysfs', mountpoint='/sys', fstype='sysfs', opts='rw'), sdiskpart(device='devpts', mountpoint='/dev/pts', fstype='devpts', opts='rw,gid=5,mode=620'), sdiskpart(device='tmpfs', mountpoint='/dev/shm', fstype='tmpfs', opts='rw'), sdiskpart(device='/dev/sda3', mountpoint='/boot', fstype='ext4', opts='rw'), sdiskpart(device='/dev/mapper/VolGroup-lv_home', mountpoint='/home', fstype='ext4', opts='rw'), sdiskpart(device='', mountpoint='/proc/sys/fs/binfmt_misc', fstype='binfmt_misc', opts='rw')]
#硬盘IO的使用情况
>>> psutil.disk_io_counters()
sdiskio(read_count=107158, write_count=20666736, read_bytes=1792485376, write_bytes=133169932288, read_time=130421, write_time=337076882)
4、采集网卡流量和网络IO:
#统计总体信息
>>> psutil.net_io_counters()
snetio(bytes_sent=984192973, bytes_recv=1274031495, packets_sent=3924134, packets_recv=6024010, errin=0, errout=0, dropin=0, dropout=0)
#查看具体每个接口
{'lo': snetio(bytes_sent=349343820, bytes_recv=349343820, packets_sent=1583789, packets_recv=1583789, errin=0, errout=0, dropin=0, dropout=0), 'em1': snetio(bytes_sent=634794145, bytes_recv=823789288, packets_sent=2339457, packets_recv=3623086, errin=0, errout=0, dropin=0, dropout=0), 'em4': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'em3': snetio(bytes_sent=59939, bytes_recv=100907694, packets_sent=932, packets_recv=817226, errin=0, errout=0, dropin=0, dropout=0), 'em2': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)}
*注:当然还有很多信息,大家可以去官网查看,,我这里就简单解释了
下面是为了方便下次调用的时候写的模块,返回参数单位都是M。大家需要转换成G为单位的话直接/1024即可。
[root@mail test]# cat miontor.py
#!/usr/bin/env python
import re,pickle
import psutil
import time
def GetcpuLoad():
cpuLoad=psutil.cpu_percent(interval=1)
return cpuLoad
def GetMeminfo():
mem = psutil.virtual_memory()
mem_total = mem.total/1024/1024
mem_user = mem.used/1024/1024
mem_free = mem.free/1024/1024
mem_dic = {'mem_total':float(mem_total),'mem_user':float(mem_user),'mem_free':float(mem_free)}
return mem_dic
def GetNetworkinfo(eth):
networkinfo = psutil.net_io_counters(pernic=True)[eth]
bytes_sent=list(networkinfo)[0]/1024/1024
bytes_recv=list(networkinfo)[1]/1024/1024
total = (bytes_sent+bytes_recv)
return total
def GetNetworkio():
networkio = psutil.net_io_counters()
bytes_sent = list(networkio)[0]/1024/1024
bytes_recv = list(networkio)[1]/1024/1024
total = (bytes_sent+bytes_recv)
return total
def GetdiskIO():
disk_io = psutil.disk_io_counters()
read_count =list(disk_io)[0]/1024/1024
write_count =list(disk_io)[1]/1024/1024
io_total = (read_count+write_count)
return io_total
def GetdiskSize():
disk_list = []
d_list = []
total_disk = []
disk_name=list(psutil.disk_partitions())
for name in disk_name:
disk_list.append(list(name)[1])
with open('fdisk_list.txt','w') as fd:
pickle.dump(disk_list,fd)
with open('fdisk_list.txt','r') as fd:
fdisk_name = pickle.load(fd)
for n in fdisk_name:
fdisk_name_list = n
total=list(psutil.disk_usage(n))[0]/1024/1024
used =list(psutil.disk_usage(n))[1]/1024/1024
free =list(psutil.disk_usage(n))[2]/1024/1024
d_list=[fdisk_name_list,total,used,free]
total_disk.append(d_list)
with open('total_list.txt','w') as fd:
pickle.dump(total_disk,fd)
if __name__ =='__main__':
# print GetMeminfo()
print GetNetworkinfo('em3')
附:刚刚朋友问我以后公司的nginx分析能不能返回状态码出图显示,这里刚刚也写了一下,贴出来:
[root@mail test]# cat nginx_log.py
#!/usr/bin/env python
def gethttpcode(code):
n = 0
f = open('/tmp/www_access.log')
for d in f.readlines():
xiaoluo = d.split()
num = xiaoluo[8]
if num == code:
n += 1
return n
f.close()
if __name__ =='__main__':
# print gethttpcode('200')
# print gethttpcode('304')
print gethttpcode('500')
我们获取到的这些数据,可以入mysql数据库,通过灵活性,可以适当的结合报表出图。