一行代码监控CPU,三行脚本追踪进程,Python运维自动化的秘密武器
一、psutil:系统监控的瑞士军刀
psutil(Process and System Utilities)是一个跨平台库,支持Linux、Windows、macOS等主流操作系统。它通过统一的API接口封装了系统底层资源数据,解决了开发者需要调用多平台命令行工具(如ps、top、netstat)的碎片化问题。其核心优势在于:
- 跨平台一致性:同一代码在Windows和Linux获取CPU使用率无需适配
- 高性能低开销:C语言核心实现,资源占用远低于启动子进程执行命令
- 进程级细粒度控制:支持进程创建、终止、资源追踪等全生命周期管理
安装仅需一行命令:
pip install psutil
二、核心功能深度解析
1. CPU监控:从宏观到微观
- 逻辑与物理核心识别
cpu_count(logical=False)返回物理核心数,logical=True则包含超线程虚拟核心:
import psutil
print(f"物理核心: {psutil.cpu_count(logical=False)}") # 输出:物理核心: 8
- 多维度时间统计
cpu_times()返回命名元组,区分用户态(user)、内核态(system)、空闲(idle)等状态耗时:
times = psutil.cpu_times()
print(f"用户态耗时占比: {times.user / sum(times) * 100:.1f}%")
- 实时使用率采样
通过interval参数避免瞬时抖动,percpu可细分每个核心状态:
# 每1秒采样,输出各核心使用率列表
print(psutil.cpu_percent(interval=1, percpu=True))
# 示例输出:[12.3, 8.4, 15.1, 5.6]
2. 内存管理:突破物理限制
- 虚拟内存精细化分析
virtual_memory()返回结构包含缓冲(buffers)、缓存(cached)等常被忽视的指标:
mem = psutil.virtual_memory()
print(f"可用内存(含缓冲): {mem.available / 1024**3:.2f}GB")
- Swap分区预警机制
当swap_memory().percent > 30%时需警惕内存瓶颈:
swap = psutil.swap_memory()
if swap.percent > 30:
print("警告:交换空间过度使用!")
3. 磁盘与网络:I/O瓶颈定位
- 分区使用率与IO关联分析
结合disk_usage()和disk_io_counters()定位高负载磁盘:
usage = psutil.disk_usage('/')
io = psutil.disk_io_counters(perdisk=True)['sda1']
print(f"sda1 写压力:{io.write_time / io.write_count:.2f} ms/次")
- 网络异常包检测
通过net_io_counters()捕获丢包与错误:
net = psutil.net_io_counters()
if net.errin > 0:
print(f"网络入错包数:{net.errin}")
4. 进程控制:从监控到治理
- 进程树资源追踪
递归获取子进程资源总和:
def get_child_mem(pid):
p = psutil.Process(pid)
total_mem = p.memory_info().rss
for child in p.children(recursive=True):
total_mem += child.memory_info().rss
return total_mem
- 进程状态机操作
支持挂起(suspend)、恢复(resume)、终止(terminate)等操作:
p = psutil.Process(1234)
if p.cpu_percent() > 90:
p.terminate() # CPU占用超90%时强制终止
三、实战场景:从监控到自动化
1. 实时系统仪表盘(终端版)
import psutil, time
while True:
# 清屏并输出关键指标
print("\033c", end="") # Linux/Mac清屏
print(f"CPU: {psutil.cpu_percent()}% | MEM: {psutil.virtual_memory().percent}%")
print(f"DISK: {psutil.disk_usage('/').percent}% | NET: {psutil.net_io_counters().bytes_recv/1024:.1f}KB")
time.sleep(1)
2. 进程资源记录器(CSV持久化)
监控指定进程并保存时序数据:
import sys, psutil, time
pid = int(sys.argv[1])
p = psutil.Process(pid)
with open(f"proc_{pid}.csv", "w") as f:
f.write("time,cpu%,mem%\n")
while True:
t = time.strftime("%H:%M:%S")
cpu = p.cpu_percent(interval=1)
mem = p.memory_percent()
f.write(f"{t},{cpu},{mem}\n")
3. 异常进程自动治理服务
当进程资源超阈值时自动重启:
def watchdog(pid, max_cpu=80, max_mem=20):
p = psutil.Process(pid)
while True:
if p.cpu_percent() > max_cpu or p.memory_percent() > max_mem:
p.terminate()
new_proc = psutil.Popen(["python", "app.py"]) # 重启服务
print(f"进程{pid}已重启,新PID: {new_proc.pid}")
time.sleep(5)
四、高阶应用:集成生态
- Web可视化:集成Flask+ECharts,将
psutil数据转为实时图表 - 告警系统:结合SMTP库在内存超限时邮件通知
- 容器监控:适配Docker环境获取容器内资源数据(需挂载
/proc) - Grafana对接:通过Prometheus客户端上报指标
最佳实践提示:生产环境中建议设置interval≥1秒的采样间隔,避免高频调用导致性能损耗。
psutil以不到5MB的内存占用,实现了数十个命令行工具的功能聚合。其设计哲学印证了Python之禅:”简洁胜于复杂“—— 当一行代码能替代三行Shell脚本时,系统监控的终极形态已然显现。
1088

被折叠的 条评论
为什么被折叠?



