掘金 人工智能 05月04日 01:14
Python 之运维自动化 psutil 模块的基本使用及原理(53)
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入介绍了Python的psutil模块,该模块为运维自动化提供了强大的跨平台支持。通过psutil,运维人员可以轻松获取CPU、内存、磁盘、网络等关键系统资源的使用情况,以及进程的详细信息。文章详细讲解了如何使用psutil获取CPU核心数和使用率、内存使用情况(包括物理内存和交换内存)、磁盘分区信息和I/O统计、网络接口信息和I/O统计。此外,还介绍了如何利用psutil获取进程信息,甚至终止进程。psutil通过封装不同操作系统的底层系统调用,实现了跨平台兼容,是系统监控和管理自动化的得力助手。

🖥️ psutil模块是一个跨平台的Python库,能够获取系统运行的进程和系统利用率(CPU、内存、磁盘、网络等)信息,它实现了许多典型的系统命令工具(如 ps、top、lsof 等)的功能,并且提供了更方便的编程接口,使得开发者可以使用 Python 代码来实现系统监控和管理任务。

💾 通过`psutil.disk_partitions()`获取磁盘分区信息,包括设备名、挂载点和文件系统类型,并使用`psutil.disk_usage()`获取指定挂载点的磁盘使用情况,包括总容量、已使用容量、可用容量和使用率。

🌐 使用`psutil.net_if_addrs()`获取网络接口信息,包括IPv4地址、IPv6地址和MAC地址,并通过`psutil.net_io_counters()`获取网络I/O统计信息,包括发送字节数和接收字节数。

🔑 `psutil`模块通过封装不同操作系统的底层系统调用和命令来实现跨平台的功能。在不同的操作系统上,`psutil`会使用不同的方法来获取系统信息和进程信息。例如,在 Linux 系统上,它会调用 `/proc` 文件系统中的文件来获取系统和进程信息;在 Windows 系统上,它会使用 Windows API 来获取相关信息。

Python 之运维自动化 psutil 模块的基本使用及原理

一、引言

在运维工作中,对系统资源的监控和管理是至关重要的。系统资源包括 CPU、内存、磁盘、网络等,及时了解这些资源的使用情况可以帮助运维人员发现系统的性能瓶颈、排查故障以及进行合理的资源分配。Python 的 psutil 模块(Process and System Utilities)为我们提供了一个跨平台的接口,用于获取系统信息和进程信息,从而实现系统资源的监控和管理自动化。本文将详细介绍 psutil 模块的基本使用方法以及其背后的工作原理。

二、psutil 模块概述

2.1 模块作用

psutil 模块是一个跨平台的 Python 库,可用于获取系统运行的进程和系统利用率(CPU、内存、磁盘、网络等)信息。它实现了许多典型的系统命令工具(如 pstoplsof 等)的功能,并且提供了更方便的编程接口,使得开发者可以使用 Python 代码来实现系统监控和管理任务。

2.2 安装模块

在使用 psutil 模块之前,需要先进行安装。可以使用 pip 命令进行安装:

pip install psutil

安装完成后,就可以在 Python 脚本中导入并使用该模块了。

2.3 导入模块

在 Python 脚本中,可以使用以下方式导入 psutil 模块:

import psutil  # 导入 psutil 模块,用于后续的系统信息获取

三、获取系统信息

3.1 获取 CPU 信息

3.1.1 获取 CPU 逻辑核心数
import psutil# 获取 CPU 的逻辑核心数logical_cores = psutil.cpu_count(logical=True)print(f"CPU 逻辑核心数: {logical_cores}")

在上述代码中,psutil.cpu_count(logical=True) 用于获取 CPU 的逻辑核心数。logical=True 表示获取逻辑核心数,如果设置为 False,则获取物理核心数。

3.1.2 获取 CPU 使用率
import psutilimport time# 获取 CPU 在 1 秒内的使用率cpu_percent = psutil.cpu_percent(interval=1)print(f"CPU 使用率: {cpu_percent}%")# 持续获取 CPU 使用率for _ in range(5):    cpu_percent = psutil.cpu_percent(interval=1)    print(f"当前 CPU 使用率: {cpu_percent}%")    time.sleep(1)

psutil.cpu_percent(interval=1) 用于获取 CPU 在指定时间间隔(这里是 1 秒)内的使用率。通过循环可以持续获取 CPU 使用率。

3.2 获取内存信息

3.2.1 获取系统内存使用情况
import psutil# 获取系统内存的使用情况memory = psutil.virtual_memory()print(f"总内存: {memory.total / (1024 ** 3):.2f} GB")print(f"已使用内存: {memory.used / (1024 ** 3):.2f} GB")print(f"可用内存: {memory.available / (1024 ** 3):.2f} GB")print(f"内存使用率: {memory.percent}%")

psutil.virtual_memory() 返回一个包含系统内存使用情况的对象,通过该对象的属性可以获取总内存、已使用内存、可用内存和内存使用率等信息。

3.2.2 获取交换内存使用情况
import psutil# 获取交换内存的使用情况swap = psutil.swap_memory()print(f"总交换内存: {swap.total / (1024 ** 3):.2f} GB")print(f"已使用交换内存: {swap.used / (1024 ** 3):.2f} GB")print(f"可用交换内存: {swap.free / (1024 ** 3):.2f} GB")print(f"交换内存使用率: {swap.percent}%")

psutil.swap_memory() 返回一个包含交换内存使用情况的对象,通过该对象的属性可以获取交换内存的相关信息。

3.3 获取磁盘信息

3.3.1 获取磁盘分区信息
import psutil# 获取所有磁盘分区的信息partitions = psutil.disk_partitions()for partition in partitions:    print(f"设备: {partition.device}")    print(f"挂载点: {partition.mountpoint}")    print(f"文件系统类型: {partition.fstype}")    try:        # 获取该分区的使用情况        usage = psutil.disk_usage(partition.mountpoint)        print(f"总容量: {usage.total / (1024 ** 3):.2f} GB")        print(f"已使用容量: {usage.used / (1024 ** 3):.2f} GB")        print(f"可用容量: {usage.free / (1024 ** 3):.2f} GB")        print(f"使用率: {usage.percent}%")    except PermissionError:        print("没有权限获取该分区的使用情况。")    print("-" * 30)

psutil.disk_partitions() 返回一个包含所有磁盘分区信息的列表,通过遍历该列表可以获取每个分区的设备名、挂载点和文件系统类型等信息。psutil.disk_usage() 用于获取指定挂载点的磁盘使用情况。

3.3.2 获取磁盘 I/O 统计信息
import psutil# 获取磁盘 I/O 统计信息disk_io = psutil.disk_io_counters()print(f"读取字节数: {disk_io.read_bytes}")print(f"写入字节数: {disk_io.write_bytes}")

psutil.disk_io_counters() 返回一个包含磁盘 I/O 统计信息的对象,通过该对象的属性可以获取磁盘的读取字节数和写入字节数等信息。

3.4 获取网络信息

3.4.1 获取网络接口信息
import psutil# 获取所有网络接口的信息net_if_addrs = psutil.net_if_addrs()for interface, addrs in net_if_addrs.items():    print(f"网络接口: {interface}")    for addr in addrs:        if addr.family == psutil.AF_INET:            print(f"  IPv4 地址: {addr.address}")        elif addr.family == psutil.AF_INET6:            print(f"  IPv6 地址: {addr.address}")        elif addr.family == psutil.AF_LINK:            print(f"  MAC 地址: {addr.address}")

psutil.net_if_addrs() 返回一个包含所有网络接口信息的字典,通过遍历该字典可以获取每个网络接口的 IPv4 地址、IPv6 地址和 MAC 地址等信息。

3.4.2 获取网络 I/O 统计信息
import psutil# 获取网络 I/O 统计信息net_io = psutil.net_io_counters()print(f"发送字节数: {net_io.bytes_sent}")print(f"接收字节数: {net_io.bytes_recv}")

psutil.net_io_counters() 返回一个包含网络 I/O 统计信息的对象,通过该对象的属性可以获取网络的发送字节数和接收字节数等信息。

四、获取进程信息

4.1 获取所有进程信息

import psutil# 遍历所有正在运行的进程for proc in psutil.process_iter(['pid', 'name', 'username']):    try:        # 获取进程的详细信息        process_info = proc.info        print(f"进程 ID: {process_info['pid']}")        print(f"进程名称: {process_info['name']}")        print(f"用户名: {process_info['username']}")        print("-" * 30)    except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):        pass

psutil.process_iter() 用于迭代所有正在运行的进程,通过指定参数 ['pid', 'name', 'username'] 可以获取进程的 ID、名称和用户名等信息。

4.2 根据进程 ID 获取进程信息

import psutil# 指定进程 IDpid = 1234try:    # 根据进程 ID 获取进程对象    process = psutil.Process(pid)    print(f"进程 ID: {process.pid}")    print(f"进程名称: {process.name()}")    print(f"进程状态: {process.status()}")    print(f"CPU 使用率: {process.cpu_percent(interval=1)}%")    print(f"内存使用率: {process.memory_percent()}%")except psutil.NoSuchProcess:    print(f"进程 ID {pid} 对应的进程不存在。")

psutil.Process(pid) 用于根据进程 ID 获取进程对象,通过该对象的方法可以获取进程的详细信息,如名称、状态、CPU 使用率和内存使用率等。

4.3 终止进程

import psutil# 指定进程 IDpid = 1234try:    # 根据进程 ID 获取进程对象    process = psutil.Process(pid)    # 终止进程    process.terminate()    print(f"进程 ID {pid} 已终止。")except psutil.NoSuchProcess:    print(f"进程 ID {pid} 对应的进程不存在。")except psutil.AccessDenied:    print(f"没有权限终止进程 ID {pid} 对应的进程。")

process.terminate() 方法用于终止指定进程。在终止进程时,可能会因为进程不存在或没有权限而抛出异常,需要进行相应的处理。

五、psutil 模块的原理

5.1 跨平台实现

psutil 模块是一个跨平台的库,它通过封装不同操作系统的底层系统调用和命令来实现跨平台的功能。在不同的操作系统上,psutil 会使用不同的方法来获取系统信息和进程信息。例如,在 Linux 系统上,它会调用 /proc 文件系统中的文件来获取系统和进程信息;在 Windows 系统上,它会使用 Windows API 来获取相关信息。通过这种方式,psutil 可以在不同的操作系统上提供统一的编程接口,方便开发者进行跨平台的系统监控和管理。

5.2 系统调用和文件读取

在获取系统信息和进程信息时,psutil 主要通过系统调用和文件读取来实现。例如,在获取 CPU 使用率时,psutil 会读取 /proc/stat 文件(在 Linux 系统上)来获取 CPU 的使用时间信息,然后通过计算得出 CPU 使用率。在获取进程信息时,它会读取 /proc/<pid> 目录下的文件(在 Linux 系统上)来获取进程的详细信息,如进程的状态、内存使用情况等。在 Windows 系统上,psutil 会使用 Windows API 来获取系统和进程信息,这些 API 提供了访问系统内核数据结构的接口。

5.3 缓存和更新机制

为了提高性能,psutil 会对一些频繁使用的信息进行缓存。例如,在获取 CPU 使用率时,psutil 会在第一次调用时记录 CPU 的使用时间,然后在后续调用时通过比较两次记录的时间差来计算 CPU 使用率,避免了重复读取文件或调用系统调用。同时,psutil 也提供了更新机制,当需要获取最新的信息时,可以通过设置合适的参数来强制更新缓存。

六、总结与展望

6.1 总结

psutil 模块为 Python 开发者提供了一个强大而方便的工具,用于实现系统资源的监控和管理自动化。通过 psutil,可以轻松获取 CPU、内存、磁盘、网络等系统资源的使用情况,以及进程的详细信息。该模块的跨平台特性使得开发者可以在不同的操作系统上使用相同的代码进行系统监控和管理,提高了开发效率。同时,psutil 通过封装底层系统调用和文件读取,为开发者提供了一个简单易用的编程接口,无需深入了解不同操作系统的底层细节。

6.2 展望

随着计算机系统的不断发展和运维需求的不断增加,psutil 模块可能会有以下几个方面的发展:

总之,psutil 模块在运维自动化领域有着广阔的应用前景,未来将不断发展和完善,为开发者和运维人员提供更强大、更便捷的系统监控和管理工具。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

psutil模块 运维自动化 Python 系统监控
相关文章