psutil:系统性能信息库
2025-02-17
psutil 是跨平台库,能够轻松实现获取系统运行的进程和系统利用率
主要有 CPU 内存 磁盘 网络等
应用于 系统监控 分析和限制系统资源及进程的管理
实现等同于命令行工具提供的功能:
ps top lsof netstat ifconfig who df kill free nice ionice iostat iotop uptime pidof tty taskset pmap# 使用psutil库 安装 # 在linux中的安装使用下面的方法 ''' wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz --no-check-certificate tar -zxvf psutil-2.0.0.tar,gz cd psutil-2.0.0 python setup.py install ''''\nwget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz --no-check-certificate\ntar -zxvf psutil-2.0.0.tar,gz\ncd psutil-2.0.0\npython setup.py install\n'
获取系统性能信息
CPU信息
# psutil 获取内存信息
import psutil
mem = psutil.virtual_memory()
print(mem.total,mem.used) #总内存 已经使用的内存
print('*' * 20)
# psutil 获取系统性能信息
# CPU信息
import psutil
cpu_mersion=psutil.cpu_times() # 获取CPU完整信息,需要显示所有的逻辑CPU信息
print(cpu_mersion)
print("*" * 20)
scputimes=psutil.cpu_times(percpu=True)
print(scputimes)
print("*" * 20)
user_cpu=psutil.cpu_times().user #获取用户的user的CPU时间比
print(user_cpu)
print("*" * 20)
cpu_count=psutil.cpu_count(logical=False) # 获取CPU的物理个数
print(cpu_count)8140427264 5311926272
********************
scputimes(user=22041.671874999996, system=22197.531250000233, idle=1286902.6093749998, interrupt=335.4375, dpc=393.265625)
********************
[scputimes(user=5051.75, system=6444.75, idle=321289.171875, interrupt=242.890625, dpc=353.515625), scputimes(user=4940.90625, system=5250.796875, idle=322593.6875, interrupt=37.96875, dpc=15.359375), scputimes(user=6126.75, system=5436.703124999942, idle=321221.921875, interrupt=28.40625, dpc=11.125), scputimes(user=5922.265624999999, system=5065.28125, idle=321797.82812499994, interrupt=26.171875, dpc=13.265625)]
********************
22041.671874999996
********************
4内存信息
内存利用率信息涉及下面内容
- total:内存总数
- used:已使用的内存数
- free:空闲内存数
- buffers:缓冲使用数
- cache:缓存使用数
- swap:交换分区使用数
方法
- psutil.virtual_memory()
- psutil.swap.memory()
例子
import psutil mem=psutil.virtual_memory() #获取内存的完整信息 print(mem) print("*" * 20) print(mem.total) # 获取内存总数 单位kb print("*" * 20) print(mem.free) # 获取空闲内存数 单位kb print("*" * 20) print(psutil.swap_memory()) # 获取swap分区信息svmem(total=8140427264, available=2802839552, percent=65.6, used=5337587712, free=2802839552) ******************** 8140427264 ******************** 2802839552 ******************** sswap(total=12237508608, used=9953914880, free=2283593728, percent=81.3, sin=0, sout=0)
获取磁盘信息
主要关注的是磁盘的利用率和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() 获取
例子
import psutil disk_mersion = psutil.disk_partitions() print(disk_mersion) # 获取磁盘完整信息 print("*" * 20) disk_usage = psutil.disk_usage('/') # 获取磁盘分区使用情况 print(disk_usage) print("*" * 20) IO_count = psutil.disk_io_counters() #获取磁盘总的IO个数 print(IO_count) print("*" * 20) IO_one_count = psutil.disk_io_counters(perdisk=True) # 获取单个分区的IO个数 print(IO_one_count)[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='F:\\', mountpoint='F:\\', fstype='NTFS', opts='rw,fixed')] ******************** sdiskusage(total=64424505344, used=38720602112, free=25703903232, percent=60.1) ******************** sdiskio(read_count=1440399, write_count=6067122, read_bytes=97091175936, write_bytes=114230301696, read_time=895, write_time=881) ******************** {'PhysicalDrive0': sdiskio(read_count=1411018, write_count=6055467, read_bytes=68480579072, write_bytes=106586880000, read_time=765, write_time=827), 'PhysicalDrive1': sdiskio(read_count=29381, write_count=11655, read_bytes=28610596864, write_bytes=7643421696, read_time=130, write_time=54)}
网络信息
- 几个关键点
- bytes_sent: 发送字节数
- bytes_recv: 接收字节数
- packets_sent: 发送数据包数
- packets_recv: 接收数据包数
- 这些信息可用 psutil.net_io_counters() 获取
net_io = psutil.net_io_counters() # 获取网络总的IO信息。默认pernic=Flase
print(net_io)
print('*' * 20)
net_one_io = psutil.net_io_counters(pernic=True) # 获取单个网络接口的IO信息
print(net_one_io)snetio(bytes_sent=7332570178, bytes_recv=1442451670, packets_sent=5322907, packets_recv=3243355, errin=0, errout=0, dropin=0, dropout=0)
********************
{'Npcap Loopback Adapter': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), '以太网 3': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), '以太网': snetio(bytes_sent=7332567343, bytes_recv=1442451670, packets_sent=5320072, packets_recv=3243355, errin=0, errout=0, dropin=0, dropout=0), '以太网 2': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'VMware Network Adapter VMnet1': snetio(bytes_sent=1383, bytes_recv=0, packets_sent=1383, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'VMware Network Adapter VMnet8': snetio(bytes_sent=1452, bytes_recv=0, packets_sent=1452, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'Loopback Pseudo-Interface 1': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)}其他系统信息
# 获取当前登录系统的用户信息
import psutil
user = psutil.users() # 获取当前登录系统的用户信息
print(user)
print('*' * 20)
# 获取当前系统的开机时间,默认使用的是linux时间戳或者windows时间戳的格式
times = psutil.boot_time()
print(times)
print("*" * 20)
# 获取当前系统开机时间,换成自然格式
import psutil, datetime
times = datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
print(times)[suser(name='wlh_pc_', terminal=None, host='0.0.0.0', started=1556814275.0, pid=None)]
********************
1556500621.0
********************
2019-04-29 09:17:01系统进程管理方法
- 当前系统的进程信息,主要有:
- 进程的启动时间
- 查看和设置CPU亲和度
- 内存使用率
- IO信息
- socket链接
- 线程数
进程信息
- 使用 psutil.pids() 方法获取所有进程PID
- 使用 psutil.Process() 方法获取单个进程的名称、路径、状态、系统资源利用率等信息
import psutil
pids = psutil.pids() # 列出所有进程PID
print(pids)
print('*' * 20)
p = psutil.Process(104) # 实例化一个Process对象,参数为进程号
print(p.name()) # 打印进程名
print('*' * 20)
print(p.exe()) # 进程bin路径
print('*' * 20)
print(p.cwd()) # 进程工作目录绝对路径
print('*' * 20)
print(p.status()) # 进程状态
print('*' * 20)
print(p.create_time()) # 进程创建时间,时间戳格式
print('*' * 20)
print(p.uids()) # 进程UID信息
print('*' * 20)
print(p.gids()) # 进程GID信息
print('*' * 20)
print(p.cpu_times()) # 进程CPU时间信息。包括 user system两个CPU时间
print('*' * 20)
print(p.cpu_affinity()) # get进程CPU亲和度,如果设置进程CPU亲和度,将CPU号作为参数即可
print('*' * 20)
print(p.memory_percent()) # 进程内存利用率
print('*' * 20)
print(p.memory_info()) # 进程rss vms信息
print('*' * 20)
print(p.io_counters()) # 进程IO信息,包含读写IO数和字节数
print('*' * 20)
print(p.connections()) # 返回进程的socket的namedutples列表,包括 fs family laddr等信息
print('*' * 20)
print(p.num_threads()) # 进程的线程数popen类的使用
- popen类的作用是获取用户启动的应用程序进程信息,来跟踪程序进程的运行状态
# 实例
import psutil
from subprocess import PIPE
p = psutil.Popen(["/usr/bin/python", "-c","print('hello')"],stdout=PIPE)
p.name()
p.username()
p.communicate()
p.cpu_times()