思维导图
前言
psutil是一个跨平台库,能够轻松实现获取系统运行的,进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OSX、FreeBSD和Sun Solaris等操作系统。
一、系统基础信息模块详解
1.1系统性能信息模块psutil
1.1.1 psutil简介
在Python中获取系统信息的好办法是使用psutil
这个第三方模块。顾名思义,
psutil
= process and system utilities,它不仅可以通过一两行代码实现系统监控,还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是系统管理员和运维小伙伴不可或缺的必备模块。
1.1.1安装psutil
pip install psutil
1.1.2获取系统性能信息
采集系统的基本性能信息包括CPU、内存、磁盘、网络等,可以完整描述当前系统的运行状态及质量。psutil模块已经封装了这些方法,用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单实用。
CPU信息
cpu_sumlogical = psutil.cpu_count() # CPU逻辑数量
cpu_sumphysics = psutil.cpu_count(logical=False) # 获取CPU的物理个数
cpu_t = psutil.cpu_times() # CPU运行时间
cpu_p = psutil.cpu_percent(interval=1, percpu=True) # 当前逻辑CPU使用率
print("CPU逻辑数量={}".format(cpu_sumlogical))
print("CPU物理数量={}".format(cpu_sumphysics))
print("CPU运行时间={}".format(cpu_t))
print("当前逻辑CPU使用率{}".format(cpu_p))
内存信息
virtuaf_m = psutil.virtual_memory() # 物理内存使用情况
print("内存信息 \n\t内存总数={:0.2f}G \n\t已使用的内存数={:0.2f}G \n\t使用率={}% \n\t空闲内存数={:0.2f}G".format(virtuaf_m[0]/(1024*1024*1024), virtuaf_m[3]/(1024*1024*1024), virtuaf_m[2], virtuaf_m[4]/(1024*1024*1024)))
磁盘信息
io = psutil.disk_partitions()
#print("系统磁盘信息:" + str(io))
for i in io:
try:
o = psutil.disk_usage(i.device)
ioo=psutil.disk_io_counters()
print(ioo)
except Exception as e:
pass
print("%s盘总容量:"%i.device + str(int(o.total / (1024.0 * 1024.0 * 1024.0))) + "G")
print("已用容量:" + str(int(o.used / (1024.0 * 1024.0 * 1024.0))) + "G")
print("可用容量:" + str(int(o.free / (1024.0 * 1024.0 * 1024.0))) + "G")
网络信息
net = psutil.net_io_counters()
'''
系统的网络信息与磁盘IO类似,涉及几个关键点,
包括bytes_sent(发送字节数)
bytes_recv=28220119(接收字节数)
packets_sent=200978(发送数据包数)
packets_recv=212672(接收数据包数)
这些网络信息使用psutil.net_io_counters)方法获取,具体见下面的操作例子:
'''
bytes_sent = '{0:.2f} Mb'.format(net[0]/(1024*1024))
bytes_rcvd = '{0:.2f} Mb'.format(net[1] /(1024*1024))
packets_sent = net[2]
packets_recv = net[3]
print("网卡接收流量= %s \n网卡发送流量= %s" % (bytes_rcvd, bytes_sent))
print("发送数据包数= %s个 \n接收数据包数= %s个" % (packets_sent, packets_recv))
参考:https://blog.youkuaiyun.com/wide288/article/details/72911195?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-1&spm=1001.2101.3001.4242