当前位置: 首页 > 工具软件 > psutil > 使用案例 >

psutil详细使用

傅振濂
2023-12-01

psutil

系统基础信息采集模块作为监控模块的重要组成部分,能够帮助运维人员了解当前系统的健康程度,同时也是衡量业务的服务质量的依据,比如系统资源吃紧,会直接影响业务的服务质量及用户体验,另外获取设备的流量信息,也可以让运维人员更好地评估带宽、设备资源是否应该扩容。本章通过运用Python第三方系统基础模块,可以轻松获取服务关键运营指标数据,包括Linux基本性能、块设备、网卡接口、系统信息、网络地址库等信息。在采集到这些数据后,我们就可以全方位了解系统服务的状态,再结合告警机制,可以在第一时间响应,将异常出现在苗头时就得以处理。

psutil模块介绍及安装

介绍

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等操作系统.

安装

pip install psutil

psutil 使用

1、系统性能信息

1. CPU信息

# 获取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()方法获取这些信息

# 获取内存的完整信息
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()获取。

# 获取磁盘的完整信息
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()方法获取

# 获取网络总的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模块还支持获取用户登录、开机时间等信息.

# 获取当前登录的用户信息
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命令的效果。

print(psutil.test())

test()命令只在linux系统下有效,windows下不可以使用。

2、系统进程管理

获得当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO信息、socket连接、线程数等,这些信息可以呈现出指定进程是否存活、资源利用情况,为开发人员的代码优化、问题定位提供很好的数据参考。

1.进程信息

psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息

# 列出所有的进程
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类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态。

import psutil
from subprocess import PIPE

p = psutil.Popen(["python", "-c", "print('Hello World!')"], stdout=PIPE)

print(p.name())

print(p.username())
# ADTEC-DONGHM\Administrator
print(p.communicate())
# (b'Hello World!\r\n', None)
 类似资料: