[1229]python模块之psutil详解

2023-10-10 08:42:02 浏览数 (1)

介绍

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
代码语言:javascript复制
# 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

0 人点赞