前言
每一位运维人员都应该对自己所管理的机器配置很清楚,因为这对我们快速处理问题很有帮助,比如随着业务增长,突然某些机器负载上涨的厉害,这时候要排查原因,除了从应用程序、架构上分析外,当前硬件性能的分析应该是必不可少的一环,今天我们将不用第三方模块,用python自带模块和系统提供的运行信息来获取我们需要的信息,这个脚本除了硬件外,还抓取了当前系统进程数和网卡流量功能,所以这个版本实现的功能基本对应了之前psutil
实现的内容,多的不说了,直接贴代码:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#!/usr/bin/env python
from collections import OrderedDict
from collections import namedtuple
import os
import glob
import re
def cpuinfo():
cpuinfo = OrderedDict()
procinfo = OrderedDict()
nprocs = 0
with open ( '/proc/cpuinfo' ) as f:
for line in f:
if not line.strip():
cpuinfo[ 'proc%s' % nprocs] = procinfo
nprocs = nprocs + 1
procinfo = OrderedDict()
else :
if len (line.split( ':' )) = = 2 :
procinfo[line.split( ':' )[ 0 ].strip()] = line.split( ':' )[ 1 ].strip()
else :
procinfo[line.split( ':' )[ 0 ].strip()] = ''
return cpuinfo
def meminfo():
meminfo = OrderedDict()
with open ( '/proc/meminfo' ) as f:
for line in f:
meminfo[line.split( ':' )[ 0 ]] = line.split( ':' )[ 1 ].strip()
return meminfo
def netdevs():
with open ( '/proc/net/dev' ) as f:
net_dump = f.readlines()
device_data = {}
data = namedtuple( 'data' ,[ 'rx' , 'tx' ])
for line in net_dump[ 2 :]:
line = line.split( ':' )
if line[ 0 ].strip() ! = 'lo' :
device_data[line[ 0 ].strip()] = data( float (line[ 1 ].split()[ 0 ]) / ( 1024.0 * 1024.0 ),
float (line[ 1 ].split()[ 8 ]) / ( 1024.0 * 1024.0 ))
return device_data
def process_list():
pids = []
for subdir in os.listdir( '/proc' ):
if subdir.isdigit():
pids.append(subdir)
return pids
dev_pattern = [ 'sd.*' , 'xv*' ]
def size(device):
nr_sectors = open (device + '/size' ).read().rstrip( '\n' )
sect_size = open (device + '/queue/hw_sector_size' ).read().rstrip( '\n' )
return ( float (nr_sectors) * float (sect_size)) / ( 1024.0 * 1024.0 * 1024.0 )
def detect_devs():
for device in glob.glob( '/sys/block/*' ):
for pattern in dev_pattern:
if re. compile (pattern).match(os.path.basename(device)):
print ( 'Device:: {0}, Size:: {1} GiB' . format (device, size(device)))
if __name__ = = '__main__' :
cpuinfo = cpuinfo()
for processor in cpuinfo.keys():
print (cpuinfo[processor][ 'model name' ])
meminfo = meminfo()
print ( 'Total memory: {0}' . format (meminfo[ 'MemTotal' ]))
print ( 'Free memory: {0}' . format (meminfo[ 'MemFree' ]))
netdevs = netdevs()
for dev in netdevs.keys():
print ( '{0}: {1} MiB {2} MiB' . format (dev, netdevs[dev].rx, netdevs[dev].tx))
pids = process_list()
print ( 'Total number of running processes:: {0}' . format ( len (pids)))
detect_devs()
|
以下是脚本的解释部分:
1、OrderedDict,这个功能是可以生成有序字典,大家都知道在python中字典是无序的,当然你也可以根据kye
来排序,但用OrderedDict
就可以直接生成有序字典,有序字典的顺序只跟你添加的顺序有关。
2、namedtuple,功能是可以给元组的索引起个名字,一般我们访问元组,只能用索引去访问,但如果给索引定义了名字,你就可以用定义的这个名字去访问了,为方便大家理解,我们举个栗子:
1
2
3
4
5
6
7
|
>>> from collections import namedtuple
>>> data = namedtuple( 'data' ,[ 'rx' , 'tx' ])
>>> d = data( 123 , 456 )
>>> print d
data(rx = 123 , tx = 456 )
>>> print d.rx
123
|
3、glob,在这行for device in glob.glob(‘/sys/block/*')
用到了这个功能,它主要方法就是glob
,它返回所有匹配的文件列表。
4、re.compile(pattern).match(os.path.basename(device)),这句是将正则表达式编译为Pattern
对象,然后使用Pattern
匹配文本,获得匹配结果,匹配成功返回真,无法匹配时将返回None。
总结
以上就是利用python获取操作系统信息的全部内容,利用python来获取还是很方便实用,希望这篇文章对大家的学习和工作能有一定的帮助。