【运维】掌控全局:用 Python 和 psutil 全方位透视你的系统性能

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门!

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界

系统管理员和开发者经常需要监控服务器或个人电脑的性能,以便及时发现瓶颈、优化资源利用率,甚至预测潜在问题。Python 的 psutil 库提供了一个强大、跨平台的方式来获取各种系统指标,如 CPU 使用率、内存占用、磁盘 I/O、网络流量等。本文将深入探讨 psutil 的功能,结合大量代码示例(包括详细的中文注释)和 LaTeX 数学公式,展示如何利用它构建全面的系统监控工具。您将学会如何收集、处理和展示性能数据,最终实现对系统健康状况的全面掌控。本文的目标是让您能够构建自己的定制化监控解决方案,或将 psutil 集成到现有的运维工具链中。

1. 引言:为什么我们需要系统监控?

在数字化时代,无论是个人电脑还是大型服务器集群,系统的稳定性和性能都至关重要。系统监控就像是给我们的数字基础设施安装了一个“健康检查仪”,可以帮助我们:

  • 及时发现问题: 在系统崩溃或性能严重下降之前,预警潜在的硬件故障、资源耗尽等问题。
  • 优化性能: 识别系统瓶颈,例如 CPU 过载、内存不足、磁盘 I/O 阻塞等,从而进行针对性的优化。
  • 资源规划: 了解系统资源的使用趋势,预测未来的需求,为扩容或缩容提供依据。
  • 故障排除: 当问题发生时,提供详细的性能数据,帮助快速定位问题的根源。
  • 安全审计: 监控异常的网络流量、进程活动等,有助于发现潜在的安全威胁。

psutil (process and system utilities) 是一个跨平台的 Python 库,可以轻松获取系统和进程的各种信息,是实现系统监控的理想工具。

2. psutil 库:安装与初步探索

2.1 安装

安装 psutil 非常简单,使用 pip 即可:

pip install psutil
2.2 初步探索:获取 CPU 信息

让我们从获取 CPU 信息开始,体验 psutil 的便捷性:

# 导入 psutil 库
import psutil

# 获取 CPU 逻辑核心数
cpu_count_logical = psutil.cpu_count()
print(f"CPU 逻辑核心数: {
     cpu_count_logical}")

# 获取 CPU 物理核心数
cpu_count_physical = psutil.cpu_count(logical=False)
print(f"CPU 物理核心数: {
     cpu_count_physical}")

# 获取 CPU 使用率(每隔 1 秒刷新一次)
for i in range(5):  # 监控5次
    cpu_percent = psutil.cpu_percent(interval=1)
    print(f"CPU 使用率: {
     cpu_percent}%")

这段代码展示了如何获取 CPU 的逻辑核心数、物理核心数,以及每秒的 CPU 使用率。psutil.cpu_percent() 函数的 interval 参数指定了采样间隔。

3. CPU 监控:深入挖掘

3.1 CPU 详细使用率

除了总体 CPU 使用率,psutil 还可以提供更详细的信息:

# 获取 CPU 的详细使用率信息
cpu_times_percent = psutil.cpu_times_percent(interval=1)

print(f"用户态 CPU 使用率: {
     cpu_times_percent.user}%")
print(f"内核态 CPU 使用率: {
     cpu_times_percent.system}%")
print(f"空闲 CPU 使用率: {
     cpu_times_percent.idle}%")
print(f"I/O 等待 CPU 使用率: {
     cpu_times_percent.iowait}%")  # 注意:某些系统可能不支持
# ... 其他指标,如 nice, irq, softirq, steal, guest, guest_nice

cpu_times_percent() 返回一个命名元组,包含了 CPU 在不同模式下花费时间的百分比。这些指标对于分析 CPU 负载的类型非常有用。例如,如果 iowait 很高,可能表示磁盘 I/O 存在瓶颈。

3.2 CPU 负载:平均负载

除了瞬时使用率,我们还可以获取系统的平均负载,这是一个反映系统繁忙程度的指标:

# 获取系统平均负载(1 分钟、5 分钟、15 分钟)
load_avg = psutil.getloadavg()
print(f"1 分钟平均负载: {
     load_avg[0]}")
print(f"5 分钟平均负载: {
     load_avg[1]}")
print(f"15 分钟平均负载: {
     load_avg[2]}")

# 建议:将平均负载除以 CPU 核心数,得到一个更直观的指标
load_avg_per_core = [x / psutil.cpu_count() for x in load_avg]
print(f"每核心 1 分钟平均负载: {
     load_avg_per_core[0]:.2f}")
print(f"每核心 5 分钟平均负载: {
     load_avg_per_core[1]:.2f}")
print(f"每核心 15 分钟平均负载: {
     load_avg_per_core[2]:.2f}")

平均负载表示在一段时间内,系统中处于可运行状态(正在使用 CPU 或等待 CPU)的平均进程数。一般来说,如果每核心的平均负载持续高于 0.7,就可能需要关注系统的性能问题。

3.3 CPU 频率
# 获取当前 CPU 频率
cpu_freq = psutil.cpu_freq()
print(f"当前 CPU 频率: {
     cpu_freq.current} MHz")
print(f"最小 CPU 频率: {
     cpu_freq.min} MHz")
print(f"最大 CPU 频率: {
     cpu_freq.max} MHz")

cpu_freq() 返回一个命名元组,其中包含了当前频率、最小频率和最大频率。

3.4 CPU 温度 (部分硬件支持)
# 获取 CPU 温度(如果硬件支持)
try:
    cpu_temperatures = psutil.sensors_temperatures()
    if 'coretemp' in cpu_temperatures: #不同平台,key值可能不同
        for entry in cpu_temperatures['coretemp']:
            print(f"{
     entry.label}: {
     entry.current}°C")
except AttributeError:
    print("无法获取 CPU 温度信息。")

部分硬件和操作系统可能不支持该功能。

4. 内存监控

4.1 内存使用情况
# 获取内存使用情况
memory = psutil.virtual_memory()

print(f"总内存: {
     memory.total / (1024 ** 3):.2f} GB")  # 转换为 GB
print(f"已使用内存: {
     memory.used / (1024 ** 3):.2f} GB")
print(f"可用内存: {
     memory.available / (1024 ** 3):.2f} GB")
print(f"内存使用率: {
     memory.percent}%")
print(f"空闲内存: {
     memory.free/ (1024 ** 3):.2f} GB")
# ... 其他指标,如 active, inactive, buffers, cached, shared, slab

psutil.virtual_memory() 返回一个命名元组,包含了各种内存指标。total 是总内存,used 是已使用的内存,available 是可供应用程序使用的内存(包括空闲内存和可回收的缓存),percent 是内存使用率。

4.2 Swap 交换分区
# 获取 Swap 交换分区使用情况
swap = psutil.swap_memory()

print(f"总 Swap 空间: {
     swap.total / (1024 ** 3):.2f} GB")
print(f"已使用 Swap 空间: {
     swap.used / (1024 ** 3):.2f} GB")
print(f"空闲 Swap 空间: {
     swap.free / (1024 ** 3):.2f} GB")
print(f"Swap 使用率: {
     swap.percent}%")
print(f"从磁盘换入内存: {
     swap.sin / (1024 ** 3):.2f} GB") #数据量
print(f"从内存换出到磁盘: {
     swap.sout / (1024 ** 3):.2f} GB")#数据量

Swap 交换分区是在物理内存不足时,将一部分硬盘空间用作内存的区域。swap_memory() 提供了 Swap 分区的总大小、已用大小、空闲大小、使用率等信息。sinsout 分别表示从磁盘换入内存和从内存换出到磁盘的数据量。

5. 磁盘监控

5.1 磁盘分区信息
# 获取磁盘分区信息
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("  无权限访问该分区信息。")

这段代码会列出所有磁盘分区及其详细信息,包括设备名、挂载点、文件系统类型、总空间、已用空间、空闲空间和使用率。

5.2 磁盘 I/O 统计
# 获取磁盘 I/O 统计信息
disk_io = psutil.disk_io_counters()

print(f"读取次数: {
     disk_io.read_count}")
print(f"写入次数: {
     disk_io.write_count}")
print(f"读取字节数: {
     disk_io.read_bytes / (1024 ** 3):.2f} GB")
print(f"写入字节数: {
     disk_io.write_bytes / (1024 ** 3):.2f} GB")
print(f"读取时间: {
     disk_io.read_time} ms")
print(f"写入时间: {
     disk_io.write_time} ms")

# 可以针对每个磁盘单独获取 I/O 统计
for disk, io in psutil.disk_io_counters(perdisk=True).items():
    print(f"磁盘 {
     disk}:")
    print(f"  读取次数: {
     io.read_count}")
    print(f"  写入次数: {
     io.write_count}")
    #
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值