介绍
psutil是一个跨平台库能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统.
安装
代码语言:javascript复制pip install psutil
psutil 使用
1、系统性能信息
1. CPU信息
代码语言:javascript复制# 获取CPU的所有信息
print(psutil.cpu_times())
# scputimes(user=36456.328125, system=44368.67187499988, idle=565606.9375, interrupt=1944.65625, dpc=515.34375)
# 获取单项数据信息,如用户user的cpu时间比
print(psutil.cpu_times().user)
# 36785.578125
# 获取cpu逻辑个数,默认logical=True4
print(psutil.cpu_count())
# 16
# 获取cpu物理个数
print(psutil.cpu_count(logical=False))
# 8
# 显示所有逻辑cpu信息
print(psutil.cpu_times(percpu=True))
2. 内存信息
Linux系统的内存利用率信息涉及total(内存总数)、used(已使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取这些信息
代码语言:javascript复制# 获取内存的完整信息
mem = psutil.virtual_memory()
print(mem)
# svmem(total=34220064768, available=20367396864, percent=40.5, used=13852667904, free=20367396864)
# 获取内存的总数
print(mem.total)
# 34220064768
# 获取已使用的内存
print(mem.used)
# 13997309952
# 获取空闲内存大小
print(mem.free)
# 20222754816
# 获取swap分区信息
swap = psutil.swap_memory()
# sswap(total=6871310336, used=8732659712, free=-1861349376, percent=127.1, sin=0, sout=0)
3. 磁盘信息
在系统的所有磁盘信息中,我们更加关注磁盘的利用率及IO信息,其中磁盘利用率使用psutil.disk_usage方法获取。磁盘IO信息包括read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节数)、write_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)等。这些IO信息可以使用psutil.disk_io_counters()获取。
代码语言:javascript复制# 获取磁盘的完整信息
print(psutil.disk_partitions())
# 获取磁盘分区的参数情况
print(psutil.disk_usage("c:\"))
# 获取硬盘总的IO个数
print(psutil.disk_io_counters())
# 获取单个分区IO个数
print(psutil.disk_io_counters(perdisk=True))
4. 网络信息
系统的网络信息与磁盘IO类似,涉及几个关键点,包括bytes_sent(发送字节数)、bytes_recv=28220119(接收字节数)、packets_sent=200978(发送数据包数)、packets_recv=212672(接收数据包数)等。这些网络信息使用psutil.net_io_counters()方法获取
代码语言:javascript复制# 获取网络总的IO信息
print(psutil.net_io_counters())
# 获取每个网络接口的IO信息
print(psutil.net_io_counters(pernic=True))
# 获取网络接口信息
print(psutil.net_if_addrs())
# 获取网络接口状态信息
print(psutil.net_if_stats())
5. 其它信息
除了前面介绍的几个获取系统基本信息的方法,psutil模块还支持获取用户登录、开机时间等信息.
代码语言:javascript复制# 获取当前登录的用户信息
print(psutil.users())
# [suser(name='Administrator', terminal=None, host=None, started=1653352534.815281, pid=None)]
# 获取当前的开机时间
boot_time_ = psutil.boot_time()
# 1653352521.2571278
print(datetime.fromtimestamp(boot_time_).strftime("%Y-%m-%d %H:%M:%S"))
# 2022-05-24 08:35:21
psutil还提供了一个test()函数,可以模拟出ps命令的效果。
代码语言:javascript复制print(psutil.test())
test()命令只在linux系统下有效,windows下不可以使用。
2、系统进程管理
获得当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO信息、socket连接、线程数等,这些信息可以呈现出指定进程是否存活、资源利用情况,为开发人员的代码优化、问题定位提供很好的数据参考。
1.进程信息
psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息
代码语言:javascript复制# 列出所有的进程
print(psutil.pids())
# 实例化一个进程对象,参数为进程的ID
p = psutil.Process(11696)
# 获取进程的名称
print(p.name())
# 获取进程的路径
print(p.exe())
# 获取进程的工作路径
print(p.cwd())
# 获取进程的状态
print(p.status())
# 获取进程的创建时间
print(p.create_time())
print(datetime.fromtimestamp(p.create_time()).strftime("%Y-%m-%d %H:%M:%S"))
# 获取进程的用户信息
print(p.username())
# 获取进程的cpu时间信息
print(p.cpu_times())
# 获取cpu的进程亲和度,如果要设置亲和度,可以做为参考
print(p.cpu_affinity())
# 获取进程的cpu利用率
print(p.cpu_percent())
# 获取进程的内存利用率
print(p.memory_percent())
# 获取进程的rss和vms信息
print(p.memory_info())
# 获取进程的IO信息
print(p.io_counters())
# 返回打开进程socket的namedutples列表
print(p.connections())
# 进程开启的线程数
print(p.num_threads())
# 当前进程的父进程ID
print(p.ppid())
# 进程的父进程
print(p.parent())
# 进程打开的文件
print(p.open_files())
# 进程终端
print(p.terminal()) # windows下无此方法
2.popen类的使用
psutil提供的popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态。
代码语言:javascript复制import psutil
from subprocess import PIPE
p = psutil.Popen(["python", "-c", "print('Hello World!')"], stdout=PIPE)
print(p.name())
print(p.username())
# ADTEC-DONGHMAdministrator
print(p.communicate())
# (b'Hello World!rn', None)
自动化CPU、内存脚本
- 创建脚本cpu_memory.py
# coding=gbk
#!/usr/bin/python
import psutil
import datetime
import time
def func1():
# CPU的逻辑核数
cpu_count = psutil.cpu_count()
# cpu的使用率
cup_per = psutil.cpu_percent(interval=0.5) # 0.5刷新频率
print(f"cpu的逻辑核数为{cpu_count},cpu的平均使用率为{cup_per}")
# 内存信息
memory_info = psutil.virtual_memory()
# 总内存
memory_total = memory_info.total / 1024 / 1024
# 内存使用率
#memory_per = (memory_total - memory_info.available) / memory_total * 100
memory_per = memory_info.percent
print(f"总内存大小为{memory_total}M,内存的使用率为{memory_per}")
# 硬盘信息
disk_info = psutil.disk_usage("/") # 根目录磁盘信息
#print(disk_info)
# 根目录大小
disk_total = disk_info.total
# 根目录使用情况
disk_per = float(disk_info.used / disk_total * 100 )
print(f"根目录大小为{disk_total / 1024 / 1024}M,根目录使用率为{round(disk_per,2)}")
# # 网络使用情况
# net = psutil.net_io_counters()
# #print(net)
# # 网卡配置信息
# net_ipy = psutil.net_if_addrs()
# #print(f"net_ipy {net_ipy}")
# net_ip = net_ipy['ens33'][0][1]
# print(f"本机的IP地址为{net_ip}")
# # 收取数据
# net_recv = float( net.bytes_recv / 1024 /1024)
# # 发送数据
# net_sent = float(net.bytes_sent /1024 /1024)
# print(f"网络收取{round(net_recv,2)}M的数据,发送{round(net_sent,2)}M的数据")
# 获取当前系统时间
current_time = datetime.datetime.now().strftime("%F %T") # %F年月日 %T时分秒
print(f"当前时间是:{current_time}")
time.sleep(1)
start = time.time()
end = time.time()
count = 0
while end - start <= 10:
count = 1
end = time.time()
print(f"执行第{count}次".center(50,'*'))
func1()
参考:https://blog.csdn.net/haiming0415/article/details/125313441 https://blog.51cto.com/request/5734183 https://www.liaoxuefeng.com/wiki/1016959663602400/1183565811281984