使用 Python 监控设备2024年8月29日 | 阅读 10 分钟 在接下来的教程中,我们将了解如何使用 Python 编程语言监控设备。但在开始之前,让我们简要讨论一下监控系统资源的重要性。 监控系统资源的重要性监控系统资源使我们能够定期评估关键系统资源的性能,例如:
监控对于识别占用最多资源的进程及其原因至关重要。它帮助我们了解当前系统的资源是否足够运行,或者是否存在某个恶意进程消耗了过多的资源。 对系统资源设置限制阈值将防止问题进一步升级,并确定适当的根本原因分析以解决问题。 在本教程中,我们将探讨 Python 中的 **psutil**(进程和系统实用程序)库,这是一个跨平台的库,用于检索有关运行进程和系统资源利用率(如 CPU、内存、磁盘、网络和传感器)的信息。 psutil 库目前支持以下平台:
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 说明 我们在上面的代码片段中导入了 psutil 和 platform 库。然后,我们使用 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 方法来检查硬盘空间容量。 监控和限制网络使用所有网络协议都与特定的地址族相关联。地址族提供诸如数据包分段和重组、路由、寻址和传输等服务。地址族在同一系统或不同系统上运行的进程之间提供进程间通信。 地址族通常由一些协议组成,每个协议对应一种套接字类型。 这是不同网络及其地址族的列表:
现在,让我们看以下代码片段,它演示了这一点。 代码 输出 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) 传感器,我们可以检索硬件温度、风扇速度和电池信息。我们还可以识别阈值,并在达到阈值时引发错误。 我们可以使用以下内存来实现这一点:
|
我们请求您订阅我们的新闻通讯以获取最新更新。