用python实时获取Linux系统的内存,cpu占用和流量速率

在学习python基本语法的时候可以同时写点小工具来增强自己的熟练度,在服务器运维时常常会有监控系统的内存cpu和进出站流量来判断自己的服务器的状态,废话不多说,直接实战。

一、环境

raspberry3b+,centos7 mate,python3

二、原理

1、获取内存信息

/proc/meminfo文中,我们可以实时获取当前系统的内存信息,如图

而我们要用到的是第一第二行的数据:

MemTotal: 949548 kB
MemFree: 633092 kB

 

 

 

 

 

 

2、获取cpu信息

我们可以在/proc/stat 里获取cpu的活动信息,如下图

我们要用到的是图中的选用部分

选中部分的数字解析如下:

user (29546) :从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
nice (144): 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
system (7115) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
idle (18674058) :从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
iowait (2449) :从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,
irq (0) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
softirq (572) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)
计算公式:
总时间:total_time=user+system+nice+idle+iowait+irq+softirq
取A,B两个时间点的cpu总时间:time_A和time_B
AB两点间隔:real_time=time_B-time_A
速率:rate=1-[(idle_B+iowait_B)-(idle_A+iowait_A)]/real_time

3、获取流量速率

系统将总的进出流量的信息存储在/proc/net/dev里,通过对该文件的读取可以计算两个时间间隔的平均流量。

[root@centos-rpi3 ~]# cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
wlan0: 20260837 28223 0 0 0 0 0 1059 5268837 34747 0 0 0 0 0 0
lo: 5752 72 0 0 0 0 0 0 5752 72 0 0 0 0 0 0
eth0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[root@centos-rpi3 ~]#

三、代码

[cc lang="python"]import os
import time

#得到内存占用
def get_mem():
#print cpuinfo
f=open("/proc/meminfo")
lines=f.readlines()
f.close()
i = 0
for line in lines:
if len(line)<2: continue
name = line.split(':')[0]
var = line.split(':')[1].split()[0]
if(i==0):
tatol_mem=float(str('{:.2f}'.format(float(var)/1024)))
elif(i==1):
free_mem =float(str('{:.2f}'.format(float(var)/1024)))
i+=1
if(i==2):
break
return tatol_mem,free_mem

#得到cpu的使用率
def get_cpu():
fp_a=open("/proc/stat")
cpu_a=fp_a.readline()
user_a=float(cpu_a.split()[1])
nice_a=float(cpu_a.split()[2])
syst_a=float(cpu_a.split()[3])
idle_a=float(cpu_a.split()[4])
iowt_a=float(cpu_a.split()[5])
tlrt_a=float(cpu_a.split()[6])
soft_a=float(cpu_a.split()[7])
total_a=user_a+nice_a+syst_a+idle_a+iowt_a+tlrt_a+soft_a
fp_a.close()
time.sleep(3)
fp_b=open("/proc/stat")
cpu_b=fp_b.readline()
user_b=float(cpu_b.split()[1])
nice_b=float(cpu_b.split()[2])
syst_b=float(cpu_b.split()[3])
idle_b=float(cpu_b.split()[4])
iowt_b=float(cpu_b.split()[5])
tlrt_b=float(cpu_b.split()[6])
soft_b=float(cpu_b.split()[7])
fp_b.close()
total_b=user_b+nice_b+syst_b+idle_b+iowt_b+tlrt_b+soft_b
total=total_b-total_a
rate=1-((idle_b+iowt_b)-(idle_a+iowt_a))/total
return(100*rate)
#得到进出流量
def get_netio():
data_in=0
data_out=0
fp_io=open("/proc/net/dev")
lines=fp_io.readlines()
for line in lines:
if (len(line.split(':'))<2):
continue
else:
data_all=line.split(':')[1]
data_in+=float(data_all.split()[0])
data_out+=float(data_all.split()[1])
return data_in,data_out
#速率=变化流量/时间,时间=1秒
def get_net_rate():
first_in,first_out=get_netio()
time.sleep(1)
last_in,last_out=get_netio()
rate_in=last_in-first_in
rate_out=last_out-first_out
return rate_in,rate_out

def main():
while (1):
mem_tatol,mem_free=get_mem()
cpu_rate=get_cpu()
net_rate=get_net_rate()
print("当前总内存为:"+str(mem_tatol)+",剩余内存为:"+str(mem_free))
print("当前cpu占用率为:"+str(cpu_rate)+"%")
print("网络速率为:"+str(net_rate))
print("...............................")
time.sleep(1)
if __name__=='__main__':
main()
[/cc]

四、实验结果

当下载文件时,速率和cpu利用率基本符合实际情况

发表评论

电子邮件地址不会被公开。 必填项已用*标注