使用 Python 监控设备

2024年8月29日 | 阅读 10 分钟

在接下来的教程中,我们将了解如何使用 Python 编程语言监控设备。但在开始之前,让我们简要讨论一下监控系统资源的重要性。

监控系统资源的重要性

监控系统资源使我们能够定期评估关键系统资源的性能,例如:

  1. 中央处理器
  2. 内存 - RAM、交换空间和硬盘空间
  3. 网络利用率
  4. GPU 利用率

监控对于识别占用最多资源的进程及其原因至关重要。它帮助我们了解当前系统的资源是否足够运行,或者是否存在某个恶意进程消耗了过多的资源。

对系统资源设置限制阈值将防止问题进一步升级,并确定适当的根本原因分析以解决问题。

在本教程中,我们将探讨 Python 中的 **psutil**(进程和系统实用程序)库,这是一个跨平台的库,用于检索有关运行进程和系统资源利用率(如 CPU、内存、磁盘、网络和传感器)的信息。

psutil 库目前支持以下平台:

  1. Linux
  2. Windows
  3. MacOS
  4. FreeBSD, OpenBSD, NetBSD
  5. Sun Solaris
  6. AIX

GPUtil 库是一个 Python 模块,用于借助 nvidia-smi 获取 NVIDIA GPU 的 GPU 状态。

系统配置

对系统进行配置是必要的,以便了解系统的名称、操作系统 (OS) 版本、系统架构(是 64 位还是 32 位)、物理内核和虚拟内核的数量,以及 CPU 的最高和最低频率。

Python 的 platform 库允许我们检索标识平台的各种数据,例如设备名称、OS 版本、OS 发行版本、节点、处理器等。

让我们看以下代码片段,它演示了上述库的用法。

代码

输出

System: Windows
Node Name: MANGO-HOME
Release: 10
Version: 10.0.22000
Machine: AMD64
Processor: Intel64 Family 6 Model 165 Stepping 2, GenuineIntel
Physical cores: 4
Total cores: 8
Max Frequency:  2496.00Mhz
Min Frequency:  0.00Mhz
Current Frequency:  2496.00Mhz

说明

我们在上面的代码片段中导入了 psutilplatform 库。然后,我们使用 platform 库的 uname() 方法获取 platform 的用户名。然后,我们打印了系统名称、节点名称、发行版、版本、机器、处理器、物理内核和总内核等详细信息。然后,我们使用 psutil 库的 cpu_freq() 方法获取 CPU 频率,并打印了最高、最低和当前频率等详细信息。

监控和限制 CPU 资源

我们可以监控不同物理内核的温度。如果任何物理内核的当前温度高于该内核的阈值限制,则会发出警报。

psutil.sensors_temperatures(fahrenheit = True) 方法提供了各种物理内核的当前、高温和关键温度。此方法不适用于 Windows。

让我们看以下代码片段,它演示了上述方法的用法。

代码

说明

在上面的代码片段中,我们导入了 psutil 库,使用了 sensors_temperatures(fahrenheit = True) 方法,并打印了与不同物理内核当前温度相关的必需详细信息。

监控和限制内存

虚拟内存是 RAM 和 CPU 上运行的进程使用的磁盘空间的组合。相比之下,交换空间是硬盘上的虚拟内存的一部分,当 RAM 满时,运行的进程会使用它。

让我们看下面的代码片段来说明这一点:

代码

输出

Virtual memory
Total: 7.84GB
Available: 1.76GB
Used: 6.07GB
Percentage: 77.5 %
SWAP memory
Total: 3.88GB
Free: 908.48MB
Used: 2.99GB
Percentage: 77.1 %

说明

在上面的代码片段中,我们导入了所需的库。然后,我们定义了一个返回大小的函数。然后,我们使用了 psutil.virtual_memory() 方法,该方法以命名元组的形式返回与系统内存利用率相关的统计信息。然后,我们计算了虚拟内存的总量、可用量、已用量和百分比。

类似地,我们也使用了 psutil.swap_memory() 方法,该方法以元组的形式提供有关交换内存统计信息的信息。最后,我们计算了交换内存的总量、可用量、已用量和百分比。

限制虚拟内存和交换内存的阈值

现在,让我们看以下代码片段,它演示了如何限制虚拟内存和交换内存的阈值。

代码

输出

Low Swap Memory warning

说明

在上面的代码片段中,我们导入了所需的模块,并为虚拟内存和交换内存定义了常量阈值。然后,我们检查可用虚拟内存是否等于或低于阈值虚拟内存,并打印了相关的警告。然后,我们再次检查交换内存的百分比是否等于或高于阈值交换内存,并打印了相关的警告。

监控和限制硬盘空间

psutil 库的 disk_partitions() 方法允许我们返回所有已挂载的磁盘分区,包括设备、挂载点和文件系统类型。

让我们看以下代码片段,它演示了此方法的用法。

代码

输出

Hard Disk Information
Partitions and Usage:
Device:  C:\
Partition Mount point:  C:\
Partition File system type:  NTFS
Total Size:  329.34GB
Used Space:  195.17GB
Free hard disk Space 134.17GB
Hard disk Used Percentage:  59.3 %
Device:  D:\
Partition Mount point:  D:\
Partition File system type:  NTFS
Total Size:  146.48GB
Used Space:  26.46GB
Free hard disk Space 120.02GB
Hard disk Used Percentage:  18.1 %

说明

在上面的代码片段中,我们导入了所需的库并定义了一个返回大小的函数。然后,我们使用 disk_partitions() 方法获取所有已挂载磁盘分区的列表。然后,我们使用 for 循环遍历每个分区,并打印所需的详细信息,例如设备、分区挂载点、分区文件系统类型、总空间、已用空间、可用硬盘空间和硬盘已用百分比。我们使用了 try-except 方法来检查硬盘空间容量。

监控和限制网络使用

所有网络协议都与特定的地址族相关联。地址族提供诸如数据包分段和重组、路由、寻址和传输等服务。地址族在同一系统或不同系统上运行的进程之间提供进程间通信。

地址族通常由一些协议组成,每个协议对应一种套接字类型。

这是不同网络及其地址族的列表:

  1. AF_INET - IPv4 Internet 协议
  2. AF_INET6 - IPv6 Internet 协议
  3. AF_NETLINK - 内核用户界面设备
  4. AF_PACKET - 低级数据包接口

现在,让我们看以下代码片段,它演示了这一点。

代码

输出

Network Information
 Interface:  Ethernet
 Interface:  Ethernet
  IP Address:  169.254.65.123
  Netmask:  255.255.0.0
  Broadcast IPv4:  None
 Interface:  Ethernet
  IP Address:  fe80::dc05:fc5a:2b3f:417b
  Netmask:  None
  Broadcast IPv6:  None
 Interface:  Local Area Connection* 9
 Interface:  Local Area Connection* 9
  IP Address:  169.254.196.107
  Netmask:  255.255.0.0
  Broadcast IPv4:  None
 Interface:  Local Area Connection* 9
  IP Address:  fe80::3ce0:aa56:980:c46b
  Netmask:  None
  Broadcast IPv6:  None
 Interface:  Local Area Connection* 10
 Interface:  Local Area Connection* 10
  IP Address:  169.254.235.211
  Netmask:  255.255.0.0
  Broadcast IPv4:  None
 Interface:  Local Area Connection* 10
  IP Address:  fe80::1caa:5f5b:a099:ebd3
  Netmask:  None
  Broadcast IPv6:  None
 Interface:  Wi-Fi
 Interface:  Wi-Fi
  IP Address:  192.168.0.196
  Netmask:  255.255.255.0
  Broadcast IPv4:  None
 Interface:  Wi-Fi
  IP Address:  fe80::f199:be8:532e:b02d
  Netmask:  None
  Broadcast IPv6:  None
 Interface:  Bluetooth Network Connection
 Interface:  Bluetooth Network Connection
  IP Address:  169.254.16.59
  Netmask:  255.255.0.0
  Broadcast IPv4:  None
 Interface:  Bluetooth Network Connection
  IP Address:  fe80::c18b:b59f:f426:103b
  Netmask:  None
  Broadcast IPv6:  None
 Interface:  Loopback Pseudo-Interface 1
  IP Address:  127.0.0.1
  Netmask:  255.0.0.0
  Broadcast IPv4:  None
 Interface:  Loopback Pseudo-Interface 1
  IP Address:  ::1
  Netmask:  None
  Broadcast IPv6:  None

说明

在上面的代码片段中,我们导入了 psutil 库。然后,我们使用 net_if_addrs() 方法检索有关网络接口(虚拟和物理)的所有信息。然后,我们使用 for 循环遍历这些详细信息,并为用户打印所需的信息。

现在,我们将了解 net_io_counters() 方法的用法,该方法返回系统范围的网络 I/O 统计信息,例如已发送字节数、已接收字节数、传入数据包丢弃数或传出数据包丢弃数。

让我们看下面的代码片段来说明这一点:

代码

输出

Total Bytes Sent:  89.37MB
Total Bytes Received:  5.66GB
Total outgoing packets dropped:  0
Total incoming packets dropped: 0
Total outgoing errors:  0
Total incoming errors: 0

说明

在上面的代码片段中,我们导入了所需的库并定义了一个返回大小的函数。然后,我们使用了 net_io_counters() 方法来返回系统范围的 I/O 统计信息,并为用户打印了一些必需的详细信息。

监控 GPU

我们可以使用 Python 编程语言提供的 GPUtil 库来监控 GPU。此库允许我们从 NVIDIA GPU 检索 GPU 状态。它显示设备上所有可用的 NVIDIA GPU、可用的空闲内存、已用内存以及 GPU 温度(以摄氏度为单位)。

让我们看以下代码片段,它演示了 Python GPUtil 库的用法。

代码

输出

GeForce GTX 1650
gpu.id: 0
Total GPU: 4096.0
Memory free 3962.0MB
GPU usage: 134.0
GPU use proportion: 3.271484375
47.0 C
GeForce GTX 1650  gpu.id: 0
GPU memory usage currently is: 3.271484375% which exceeds the threshold of 10%

说明

在上面的代码片段中,我们导入了 GPUtil 库,并使用 getGPUs() 方法获取 GPU 列表。然后,我们创建了一个空列表。然后,我们使用 for 循环遍历 GPU 列表中对象的详细信息,并将其附加到空列表中。然后,我们打印了有关 GPU 内存使用情况的信息。

监控传感器

为了监控物联网 (IoT) 传感器,我们可以检索硬件温度、风扇速度和电池信息。我们还可以识别阈值,并在达到阈值时引发错误。

我们可以使用以下内存来实现这一点:

  1. sensors_temperatures()
  2. sensors_fans()
  3. sensors_battery()