在日常的后端开发和运维工作中,我们经常需要监控系统的各项指标,例如 CPU 使用率、内存占用、磁盘 I/O、网络流量等等。这些指标对于诊断性能瓶颈、优化系统资源利用率至关重要。Python 的 psutil 模块正是一个强大的跨平台库,可以轻松获取这些信息,堪称系统监控与性能分析的瑞士军刀。
问题场景重现:CPU 占用过高排查
假设我们线上部署了一个基于 Flask 的 Python Web 应用,最近频繁出现请求超时的情况。初步怀疑是 CPU 占用过高导致服务响应缓慢。我们需要快速定位问题,找出是哪个进程或线程占用了大量的 CPU 资源。此时,psutil 就能派上大用场。
底层原理深度剖析:跨平台信息获取
psutil 的强大之处在于其跨平台性。它通过调用操作系统底层的 API 来获取系统信息,屏蔽了不同操作系统之间的差异。例如,在 Linux 系统上,psutil 可能会读取 /proc 文件系统中的信息;在 Windows 系统上,则会调用 Windows API。这种底层实现保证了 psutil 在不同平台上都能提供一致的接口。
具体的代码解决方案:使用 psutil 监控 CPU 使用率
以下代码展示了如何使用 psutil 监控 CPU 使用率,并找出 CPU 占用率最高的进程:
import psutil
import time
def get_top_cpu_processes(top_n=5):
# 获取 CPU 使用率最高的 top_n 个进程
processes = []
for process in psutil.process_iter(['pid', 'name', 'cpu_percent']):
processes.append(process.info)
# 按照 CPU 使用率降序排序
sorted_processes = sorted(processes, key=lambda p: p['cpu_percent'], reverse=True)
return sorted_processes[:top_n]
if __name__ == '__main__':
while True:
top_processes = get_top_cpu_processes()
print("\nTop CPU consuming processes:")
for process in top_processes:
print(f"PID: {process['pid']}, Name: {process['name']}, CPU%: {process['cpu_percent']}")
time.sleep(1) # 每秒更新一次
这个脚本会每秒钟打印 CPU 使用率最高的 5 个进程的信息,包括 PID、进程名和 CPU 使用率。通过观察这些信息,我们可以快速找到导致 CPU 占用过高的罪魁祸首。
实战避坑经验总结:内存泄漏与句柄泄漏监控
在使用 psutil 进行系统监控时,还需要注意一些潜在的问题。例如,对于长时间运行的程序,需要注意内存泄漏和句柄泄漏的问题。psutil 提供了接口可以获取进程的内存使用情况和打开的文件句柄数。我们可以定期检查这些指标,及时发现并解决问题。
此外,在高并发场景下,例如使用 Nginx 作为反向代理服务器,同时处理大量的并发连接时,我们需要密切关注系统的 TCP 连接数、网络流量等指标。psutil 同样可以帮助我们监控这些指标,及时发现网络瓶颈,并进行相应的优化,例如调整 Nginx 的 worker 进程数、优化 TCP 参数等。如果服务器部署在宝塔面板上,也可以结合宝塔面板提供的监控功能,进行更全面的系统监控。
Python 常用三方模块 psutil 的应用远不止这些,它还可以用于监控磁盘 I/O、网络流量、进程状态等等。掌握 psutil,可以帮助我们更好地了解系统的运行状态,及时发现并解决问题,保障应用的稳定运行。
冠军资讯
Linuxer_zhao