Python psutil模块详解:系统资源监控与进程管理指南

青禾
青禾
发布时间:2026-10-12| 3人浏览过
原创

本文详细解析 Python 中用于系统监控与进程管理的 psutil 库。通过封装跨平台底层接口,提供获取 CPU 状态、内存占比、磁盘容量与 IO 统计、网卡流量及进程详情的完整 API 调用示例,附带一键式硬件巡检脚本,帮助开发者快速掌握服务器性能数据采集方法。

psutil 模块概述与标准安装

psutil 是一个跨平台的系统监控与管理 Python 库,能够以面向对象的方式轻松获取系统的进程和利用率信息,涵盖 CPU、内存、磁盘、网络等核心指标。它实现了命令行工具(如 top、lsof、netstat、df、free)的功能,广泛用于运维监控、性能分析自动化和容器环境采集。目前完美支持 Linux、Windows、macOS 及 BSD 系列系统。

现代开发环境中,推荐使用包管理器直接部署:

$ pip install psutil

官方也提供源码安装方式,适用于无外网或特殊编译环境,但日常使用 pip 即可满足需求。

核心系统资源监控 API 实战

第1步:获取 CPU 运行状态与负载

通过 cpu_times() 可查看系统累计的各类型 CPU 时间(user、system、idle、iowait 等)。结合 cpu_count() 可区分逻辑核心与物理处理器数量。实时负载则使用 cpu_percent(interval),传入秒数可返回该时间段内的平均使用率。

>>> import psutil
# 查看累计时间分布
>>> psutil.cpu_times()
scputimes(user=1024.5, nice=0.2, system=512.8, idle=98000.1)
# 获取逻辑核数与当前使用率
>>> psutil.cpu_count(logical=True)
4
>>> psutil.cpu_percent(interval=1)
2.5

第2步:查询物理内存与可用容量

内存数据主要通过 virtual_memory() 获取。返回对象包含总内存、已用、空闲、可用空间及实际使用百分比。注意 available 代表系统当前真正可分配给新进程的内存,而非简单的 free 值。

>>> mem = psutil.virtual_memory()
>>> f"总内存: {mem.total / 1024**3:.2f} GB"
'总内存: 7.89 GB'
>>> f"已用占比: {mem.percent}%"
'已用占比: 68.2%'

第3步:读取磁盘分区、容量与读写 IO

使用 disk_partitions() 列出所有挂载点及文件系统类型。针对指定路径调用 disk_usage(path) 可获取分区总容量、已用空间与剩余空间。磁盘 IO 统计推荐使用 disk_io_counters(perdisk=True),开启后可按具体盘符或设备名区分读写次数与字节量。

>>> for part in psutil.disk_partitions():
...     print(part.device, part.mountpoint)
/dev/sda1 /
/data1
>>> psutil.disk_usage('/')
sdiskusage(total=40G, used=28G, free=12G, percent=70.0)

第4步:统计网卡数据收发流量

网络统计函数为 net_io_counters(pernic=True)。关闭 pernic 时返回聚合带宽;开启后字典键名为网卡标识(如 eth0、lo)。返回值涵盖发送/接收字节数、数据包数及丢包错误计数,适合绘制实时带宽图表。

>>> stats = psutil.net_io_counters(pernic=True)
>>> print(stats['lo'])
snetio(bytes_sent=12000, bytes_recv=12000, packets_sent=100, packets_recv=100)

进程管理与系统信息采集

第5步:遍历系统进程并获取详情

系统全部 PID 可通过 pids() 一次性拉取。创建 psutil.Process(pid) 实例后即可调用丰富属性与方法:包括进程名称、工作目录、执行路径、内存占比、CPU 累计时间、打开文件数及线程数。对于子进程或外部命令,可使用 psutil.Popen() 实现类似 subprocess 的启动与实时跟踪。

>>> proc = psutil.Process(16031)
>>> proc.name(), proc.cwd(), proc.status()
('python3', '/usr/local/myapp', 'running')
>>> proc.memory_percent()
0.05

第6步:获取启动时间与在线账户

boot_time() 返回 Unix 时间戳,配合 datetime 模块可转为可读格式。users() 列出当前登录会话的用户名、终端及来源 IP,常用于审计或限流判断。

>>> import datetime
>>> dt = datetime.datetime.fromtimestamp(psutil.boot_time())
>>> dt.strftime('%Y-%m-%d %H:%M:%S')
'2023-10-15 09:30:11'

自动化巡检脚本实操

整合上述接口,以下提供一份轻量级单机巡检脚本。已修正原稿中网络收发变量错位问题,并确保输出格式稳定,可直接保存为 sys_check.py 运行:

#!/usr/bin/env python3
import psutil
import datetime
import time

def main():
    now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    print(f"[巡检时间] {now}")
    
    # CPU 概览
    logical_cores = psutil.cpu_count(logical=True)
    physical_cores = psutil.cpu_count(logical=False)
    cpu_load = psutil.cpu_percent(interval=1)
    print(f"[CPU] 物理核心: {physical_cores} | 逻辑核心: {logical_cores} | 当前负载: {cpu_load}%")
    
    # 内存概览
    vm = psutil.virtual_memory()
    total_gb = round(vm.total / (1024**3), 2)
    avail_gb = round(vm.available / (1024**3), 2)
    print(f"[内存] 总计: {total_gb}G | 可用: {avail_gb}G | 使用率: {vm.percent}%")
    
    # 启动时间与用户
    boot_dt = datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
    users = [u.name for u in psutil.users()]
    print(f"[系统] 启动于: {boot_dt} | 在线用户: {','.join(users) if users else '无'}")
    
    # 网络吞吐
    net = psutil.net_io_counters()
    sent_mb = round(net.bytes_sent / (1024**2), 2)
    recv_mb = round(net.bytes_recv / (1024**2), 2)
    print(f"[网络] 发送: {sent_mb}MB | 接收: {recv_mb}MB")
    
    # 磁盘列表
    partitions = psutil.disk_partitions()
    print(f"[磁盘] 挂载点数: {len(partitions)}")
    for p in partitions:
        usage = psutil.disk_usage(p.mountpoint)
        print(f"  → {p.device}({p.fstype}) | 总计: {round(usage.total/(1024**3),1)}G | 已用: {round(usage.used/(1024**3),1)}G")

if __name__ == "__main__":
    main()

常见排错与注意事项

  • 权限限制:在 macOS 或 Linux 下,部分进程属性(如绝对路径、环境变量)受系统安全策略保护,运行脚本时可能需要 sudo 或授予特定权限,否则会返回空值或报错。
  • 版本差异:Process 对象的部分方法在 psutil 5.0+ 版本有所调整,若遇到 AttributeError,建议升级至最新稳定版(pip install --upgrade psutil)。
  • 轮询频率:频繁调用 cpu_percent() 会干扰系统调度,生产环境采集建议间隔不低于 0.1 秒,并结合缓存机制使用。

以上就是 Python psutil 模块系统监控与进程管理的详细内容,更多关于服务器自动化巡检与性能优化的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。