【Python模块】psutil

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_times(percpu=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.0,0.0,0.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):可以由多个进程同时访问的内存。
  • slab(Linux):在内核数据结构缓存中。
  • 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=, type=, 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=, address='82-91-33-91-F1-BD', netmask=None, broadcast=None, ptp=None), snicaddr(family=, address='169.254.163.103', netmask='255.255.0.0', broadcast=None, ptp=None), snicaddr(family=, address='fe80::aa55:ee0f:3f9e:e5f0', netmask=None, broadcast=None, ptp=None)]}
print(psutil.net_if_addrs())

#{'本地连接* 3': snicstats(isup=False, duplex=, 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

你可能感兴趣的:(Python,python,psutil,系统监控和分析)