【Python模块】psutil

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1、psutil 简介

psutil Python 系统和进程实用程序是一个跨平台库用于检索 Python 中运行进程和系统利用率CPU、内存、磁盘、网络、传感器的信息。它主要用于系统监视、分析、限制进程资源和管理正在运行的进程。它实现了 UNIX 命令行工具提供的许多功能例如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap。psutil 目前支持 Linux、Windows、macOS、FreeBSD/penBSD/ NetBSD、Sun Solaris、AIX 等平台。

psutil 支持的 Python 版本为 2.7 和 3.4+在 Linux、Windows、macOS 下载方式

pip install psutil

接下来梳理下 CPU、内存、磁盘、网络等有关的函数及使用API。

2、系统相关函数

2.1 CPU

CPU 有关的函数

函数名称

函数作用

其他说明

cpu_times(percpu=False)

将系统CPU时间作为命名元组返回

当percpu为True时返回系统上每个逻辑CPU的命名元组列表。列表的第一个元素指向第一个CPU第二个元素指向第二个CPU依此类推。

cpu_percent(interval=None, percpu=False)

返回表示当前系统范围内CPU利用率百分比的浮点值。

当间隔>0.0时比较间隔前后经过的系统CPU时间阻塞。当interval为0.0或None时比较自上次调用或模块导入以来经过的系统CPU时间并立即返回。

cpu_times_percent(interval=None, percpu=False)

与cpu_percent相同但提供psutil.cpu_timespercpu=True返回的每个特定cpu时间的利用率百分比。

interval和percpu参数的含义与cpu_percent中的含义相同。

cpu_count(logical=True)

返回系统中逻辑cpu的数量与Python 3.4中的os.cpu_count相同如果不确定则返回None。

“逻辑CPU”是指物理内核数乘以每个内核上可以运行的线程数这称为“超线程”。如果逻辑值为False则仅返回物理内核的数量如果未确定则返回None。

cpu_stats()

以命名元组的形式返回各种CPU统计信息

ctx_switches自启动以来上下文开关的数量。

interrupts自启动以来中断数。

soft_interrupts自启动以来软件中断数。

syscalls自启动以来系统调用数。在Linux上始终设置为0。

cpu_freq(percpu=False)

以命名元组形式返回CPU频率包括以Mhz表示的当前、最小和最大频率

如果percpu为True并且系统支持每cpu频率检索仅限Linux则为每个cpu返回一个频率列表如果不是则返回一个包含单个元素的列表。如果无法确定最小值和最大值则将其设置为0.0。

getloadavg()

以元组形式返回过去1、5和15分钟内的平均系统负载。

“负载”表示处于可运行状态的进程使用CPU或等待使用CPU例如等待磁盘I/O。在UNIX系统上这依赖于os.getloadavg。在Windows上这是通过使用Windows API来模拟的该API生成一个线程该线程保持在后台运行每5秒更新一次结果模拟UNIX行为。因此在Windows上第一次调用它时在接下来的5秒内它将返回一个无意义的0.00.00.0元组。

使用演示当前测试平台 --- Windows

import psutil

# scputimes(user=2240.359305, system=2669.05, idle=20536.234305, interrupt=174.21805, dpc=443.953125)
print(psutil.cpu_times())
# 0.0
print(psutil.cpu_percent())
# scputimes(user=0.0, system=0.0, idle=0.0, interrupt=0.0, dpc=0.0)
print(psutil.cpu_times_percent())
# scpustats(ctx_switches=82697106, interrupts=58590008, soft_interrupts=0, syscalls=331427222)
print(psutil.cpu_stats())
# 8
print(psutil.cpu_count())
# scpufreq(current=1792.0, min=0.0, max=1992.0)
print(psutil.cpu_freq())
# (0.0, 0.0, 0.0)
print(psutil.getloadavg())

从这里可以看到CPU配置信息为八核CPU最大频率1992MHZ当前频率为1792MHZ 等。

2.2 Memory

Memory 可分为虚拟内存和交换内存有以下两个函数

①、virtual_memory()以命名元组的形式返回有关系统内存使用情况的统计信息以字节为单位主要指标有

  • total总物理内存独占交换。
  • available可用内存。
  • used已使用内存。
  • free空闲的内存。
  • active (UNIX)当前正在使用或最近使用的内存。
  • inactive (UNIX)标记为未使用的内存。
  • buffers (Linux, BSD)文件系统元数据等缓存。
  • cached (Linux, BSD)缓存各种内容。
  • shared (Linux, BSD)可以由多个进程同时访问的内存。
  • slabLinux在内核数据结构缓存中。
  • wired (BSD, macOS)标记为始终保留在RAM中的内存。它永远不会移动到磁盘。
# 当前测试平台Windows
# svmem(total=8434085888, available=1996607488, percent=76.3, used=6437478400, free=1996607488)
print(psutil.virtual_memory())

②、swap_memory()将系统交换内存统计信息作为命名元组返回以字节为单位包括以下字段

  • total以总交换内存。
  • used已用交换内存。
  • free可用交换内存。
  • percent使用百分比计算为总-可用/总*100。
  • sin系统从磁盘交换的字节数累积。
  • sout系统从磁盘交换的字节数累积。
# 当前测试平台Windows
# sswap(total=15144972288, used=8803577856, free=6341394432, percent=58.1, sin=0, sout=0)
print(psutil.swap_memory())

2.3 Disks

--> disk_partitions(): 以命名元组的形式返回所有挂载的磁盘分区信息包括设备挂载点文件系统类型等。如果在 Linux 平台类似使用df命令。

--> disk_usage(path): 返回有关分区的磁盘使用情况统计信息该分区包含作为命名元组的给定路径包括以字节表示的总空间、已用空间和可用空间以及使用百分比。

--> disk_io_counters(): 以命名元组的形式返回系统范围的磁盘I/O统计信息包括 read_count, write_count, read_bytes, write_bytes, read_time, write_time 等字段。

# 当前测试平台Windows

# [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260)]
print(psutil.disk_partitions())

# sdiskusage(total=161051269304, used=48602433888, free=112459735616, percent=31.2)
print(psutil.disk_usage("/"))

# sdiskio(read_count=800572, write_count=166800, read_bytes=26395607296, write_bytes=7520133392, read_time=814, write_time=97)
print(psutil.disk_io_counters())

2.4 Network

--> net_io_counters(): 以命名元组的形式返回系统范围内的网络I/O统计信息。

--> net_connections(): 将系统范围的套接字连接作为命名元组的列表返回。

# 当前测试平台Windows

#snetio(bytes_sent=1665035507, bytes_recv=16602087092, packets_sent=11453498, packets_recv=14149630, errin=0, errout=0, dropin=0, dropout=0)
print(psutil.net_io_counters())

#[sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=49685), raddr=(), status='LISTEN', pid=4404)]
print(psutil.net_connections())

--> net_if_addrs(): 以字典的形式返回系统上安装的每个网口关联地址信息。

-->  net_if_stats(): 以字典的形式返回系统上安装的每个网口信息isup-标识网口是否正常启动并运行中duplex-双工通信类型speed-传输速度mtu-最大传输字节flags-网口的标志。

# 当前测试平台Windows

#{'本地连接* 3': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='82-91-33-91-F1-BD', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.163.103', netmask='255.255.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::aa55:ee0f:3f9e:e5f0', netmask=None, broadcast=None, ptp=None)]}
print(psutil.net_if_addrs())

#{'本地连接* 3': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500)}
print(psutil.net_if_stats())

2.5 Processes

--> pids()返回当前运行pid的列表有序。

--> process_iter(): 返回一个迭代器为本地计算机上所有正在运行的进程生成一个 Process 类实例。这应该优先于 pids() 方法来迭代进程因为它不受竞争条件的影响。

--> pid_exists(pid)查找指定的 pid 是否存在于当前运行pid的列表。

2.6 其他系统信息

--> users()以命名元组的形式返回系统上当前连接的用户。

--> boot_time()返回自epoch以来的系统启动时间以秒为单位。

3、总结

以上就是这个模块大部分的API有些还是挺实用的在此记录一下。

参考资料

psutil documentation — psutil 5.9.5 documentation

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python