Python实现系统性能监控:基础参数获取与文件存储全攻略
2025.09.15 13:50浏览量:1简介:本文详细介绍了如何使用Python获取系统基础性能参数(CPU、内存、磁盘、网络等),并通过代码示例演示如何将这些数据写入文件,适用于系统监控、性能分析等场景。
Python实现系统性能监控:基础参数获取与文件存储全攻略
在系统运维、性能调优或资源管理中,实时获取并记录系统基础性能参数是关键环节。Python凭借其丰富的标准库和第三方工具,能够高效完成这一任务。本文将系统阐述如何使用Python获取CPU、内存、磁盘、网络等基础性能参数,并将数据结构化写入文件,为开发者提供一套完整的解决方案。
一、核心工具与模块选择
Python生态中,psutil
是系统性能监控的首选库。它跨平台(Windows/Linux/macOS),提供统一的API接口,支持获取CPU、内存、磁盘、网络、传感器等数十种参数。相较于手动调用系统命令(如top
、vmstat
),psutil
更简洁、安全,且无需处理不同操作系统的命令差异。
1.1 安装与基础使用
pip install psutil
导入后,可直接调用函数获取参数:
import psutil
# 获取CPU使用率
cpu_percent = psutil.cpu_percent(interval=1)
print(f"CPU使用率: {cpu_percent}%")
# 获取内存信息
mem = psutil.virtual_memory()
print(f"总内存: {mem.total / (1024**3):.2f}GB, 可用内存: {mem.available / (1024**3):.2f}GB")
二、关键性能参数获取与解析
2.1 CPU性能监控
- 单核/多核使用率:
psutil.cpu_percent(interval=1, percpu=True)
返回各核使用率列表。 - 负载平均值:通过
os.getloadavg()
(Linux/macOS)或psutil.getloadavg()
获取1/5/15分钟平均负载。 - 上下文切换与中断:需结合
/proc/stat
(Linux)解析,但psutil
未直接提供,可通过扩展实现。
示例:记录CPU多核数据
cpu_percent_list = psutil.cpu_percent(interval=1, percpu=True)
with open("cpu_log.csv", "a") as f:
f.write(f"{time.time()},") # 时间戳
f.write(",".join([f"{x:.2f}" for x in cpu_percent_list]) + "\n")
2.2 内存与交换分区监控
- 物理内存:
psutil.virtual_memory()
返回总内存、可用内存、使用率等。 - 交换分区:
psutil.swap_memory()
获取交换分区使用情况。 - 缓存与缓冲:通过
mem.cached
和mem.buffers
区分。
示例:内存快照写入JSON
import json
mem_info = {
"total": psutil.virtual_memory().total,
"available": psutil.virtual_memory().available,
"used_percent": psutil.virtual_memory().percent,
"swap_used": psutil.swap_memory().used
}
with open("mem_snapshot.json", "w") as f:
json.dump(mem_info, f, indent=4)
2.3 磁盘I/O与分区监控
- 磁盘使用率:
psutil.disk_usage('/')
获取根分区使用情况。 - I/O统计:
psutil.disk_io_counters()
返回读写字节数、次数等。 - 分区列表:
psutil.disk_partitions()
列出所有磁盘分区。
示例:磁盘I/O实时监控
disk_io = psutil.disk_io_counters()
with open("disk_io.log", "a") as f:
f.write(f"{time.time()},read_bytes:{disk_io.read_bytes},write_bytes:{disk_io.write_bytes}\n")
2.4 网络接口监控
- 流量统计:
psutil.net_io_counters()
获取总收发字节数。 - 连接数:
psutil.net_connections()
列出所有网络连接(需root权限)。 - 接口信息:
psutil.net_if_addrs()
获取网卡IP地址。
示例:网络流量差分计算
old_io = psutil.net_io_counters()
time.sleep(1)
new_io = psutil.net_io_counters()
bytes_sent = new_io.bytes_sent - old_io.bytes_sent
bytes_recv = new_io.bytes_recv - old_io.bytes_recv
with open("net_traffic.csv", "a") as f:
f.write(f"{time.time()},sent:{bytes_sent},recv:{bytes_recv}\n")
三、数据存储与格式化
3.1 文件格式选择
- CSV:适合结构化数据,易于用Excel或Pandas分析。
- JSON:适合嵌套数据,便于程序解析。
- SQLite:适合长期存储,支持SQL查询。
3.2 高效写入策略
- 批量写入:避免频繁打开文件,可累积数据后一次性写入。
- 时间戳:所有记录应包含时间戳,便于后续分析。
- 异常处理:捕获文件操作异常,防止程序崩溃。
示例:综合监控脚本
import psutil
import time
import csv
from datetime import datetime
def write_to_csv(data, filename):
with open(filename, "a", newline="") as f:
writer = csv.writer(f)
if f.tell() == 0: # 文件为空时写入表头
writer.writerow(["timestamp", "cpu_percent", "mem_percent", "disk_read", "disk_write", "net_sent", "net_recv"])
writer.writerow(data)
def monitor():
while True:
# 获取CPU使用率
cpu_percent = psutil.cpu_percent(interval=1)
# 获取内存使用率
mem_percent = psutil.virtual_memory().percent
# 获取磁盘I/O(差分)
old_io = getattr(monitor, "old_disk_io", psutil.disk_io_counters())
new_io = psutil.disk_io_counters()
disk_read = new_io.read_bytes - old_io.read_bytes
disk_write = new_io.write_bytes - old_io.write_bytes
monitor.old_disk_io = new_io
# 获取网络I/O(差分)
old_net = getattr(monitor, "old_net_io", psutil.net_io_counters())
new_net = psutil.net_io_counters()
net_sent = new_net.bytes_sent - old_net.bytes_sent
net_recv = new_net.bytes_recv - old_net.bytes_recv
monitor.old_net_io = new_net
# 写入CSV
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
data = [timestamp, cpu_percent, mem_percent, disk_read, disk_write, net_sent, net_recv]
write_to_csv(data, "system_monitor.csv")
time.sleep(1) # 每秒采集一次
if __name__ == "__main__":
monitor()
四、高级应用与优化
4.1 实时告警机制
结合阈值判断,当CPU使用率持续超过90%时,通过邮件或短信告警。可使用smtplib
发送邮件,或集成第三方告警服务。
4.2 数据可视化
将CSV数据导入Pandas或Matplotlib,生成趋势图:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("system_monitor.csv")
df["timestamp"] = pd.to_datetime(df["timestamp"])
df.set_index("timestamp").cpu_percent.plot(title="CPU使用率趋势")
plt.show()
4.3 性能优化技巧
- 采样频率:根据需求调整采样间隔(如1秒或5秒)。
- 资源占用:避免在监控脚本中执行耗时操作。
- 多线程:使用
threading
模块分离数据采集与写入操作。
五、总结与扩展
Python通过psutil
库实现了跨平台的系统性能监控,结合文件存储可构建轻量级监控系统。开发者可根据实际需求扩展功能,如:
本文提供的代码示例可直接用于生产环境,但需注意文件权限和磁盘空间管理。未来可进一步探索psutil
的高级功能(如传感器监控、Docker容器监控),以满足更复杂的场景需求。
发表评论
登录后可评论,请前往 登录 或 注册