logo

Python实现系统性能监控:获取基础参数并写入文件全攻略

作者:十万个为什么2025.09.25 23:03浏览量:0

简介:本文详细介绍如何使用Python获取系统基础性能参数(CPU、内存、磁盘、网络等),并通过代码示例展示如何将这些数据结构化写入文件,适用于系统监控、性能分析等场景。

Python实现系统性能监控:获取基础参数并写入文件全攻略

一、为什么需要监控系统基础性能参数?

在系统运维和开发过程中,实时掌握服务器或本地计算机的基础性能参数至关重要。无论是排查性能瓶颈、优化资源配置,还是构建自动化监控系统,都需要准确获取CPU使用率、内存占用、磁盘I/O等关键指标。Python凭借其丰富的标准库和第三方工具,可以高效完成这一任务,并将数据持久化存储以供后续分析。

二、核心性能参数分类与获取方法

1. CPU相关参数

CPU是系统的核心计算资源,主要监控指标包括:

  • 使用率:用户态、内核态、空闲等状态占比
  • 负载平均值:1分钟、5分钟、15分钟的平均负载
  • 核心数:物理核心与逻辑核心数量

实现代码

  1. import psutil
  2. def get_cpu_info():
  3. cpu_info = {
  4. "cpu_percent": psutil.cpu_percent(interval=1),
  5. "cpu_count": psutil.cpu_count(logical=False), # 物理核心数
  6. "cpu_count_logical": psutil.cpu_count(), # 逻辑核心数
  7. "load_avg": psutil.getloadavg() # Linux/macOS特有
  8. }
  9. return cpu_info

2. 内存相关参数

内存监控包括:

  • 总内存/可用内存
  • 缓存与缓冲区占用
  • 交换分区使用情况

实现代码

  1. def get_memory_info():
  2. mem = psutil.virtual_memory()
  3. swap = psutil.swap_memory()
  4. return {
  5. "total_memory_gb": round(mem.total / (1024**3), 2),
  6. "available_memory_gb": round(mem.available / (1024**3), 2),
  7. "memory_percent": mem.percent,
  8. "swap_used_gb": round(swap.used / (1024**3), 2),
  9. "swap_percent": swap.percent
  10. }

3. 磁盘与文件系统参数

关键磁盘指标:

  • 分区使用情况
  • 磁盘I/O读写速度
  • 文件系统类型

实现代码

  1. def get_disk_info():
  2. disk_info = []
  3. partitions = psutil.disk_partitions(all=False)
  4. for partition in partitions:
  5. usage = psutil.disk_usage(partition.mountpoint)
  6. disk_info.append({
  7. "device": partition.device,
  8. "mountpoint": partition.mountpoint,
  9. "fstype": partition.fstype,
  10. "total_gb": round(usage.total / (1024**3), 2),
  11. "used_gb": round(usage.used / (1024**3), 2),
  12. "free_gb": round(usage.free / (1024**3), 2),
  13. "percent": usage.percent
  14. })
  15. return disk_info

4. 网络相关参数

网络监控要点:

  • 接口流量统计
  • 连接数统计
  • 网络错误率

实现代码

  1. def get_network_info():
  2. net_io = psutil.net_io_counters()
  3. connections = psutil.net_connections(kind='inet')
  4. return {
  5. "bytes_sent": net_io.bytes_sent,
  6. "bytes_recv": net_io.bytes_recv,
  7. "packets_sent": net_io.packets_sent,
  8. "packets_recv": net_io.packets_recv,
  9. "active_connections": len(connections)
  10. }

三、数据结构化与文件写入实现

1. 数据整合与JSON格式化

将所有指标整合为结构化数据:

  1. import json
  2. from datetime import datetime
  3. def collect_all_metrics():
  4. metrics = {
  5. "timestamp": datetime.now().isoformat(),
  6. "cpu": get_cpu_info(),
  7. "memory": get_memory_info(),
  8. "disk": get_disk_info(),
  9. "network": get_network_info()
  10. }
  11. return metrics

2. 文件写入实现方案

方案一:JSON文件追加写入

  1. def write_to_json_file(data, filename="system_metrics.json"):
  2. mode = 'a' if os.path.exists(filename) else 'w'
  3. with open(filename, mode) as f:
  4. if mode == 'w':
  5. json.dump({"metrics": []}, f) # 初始化数组
  6. f.seek(0, os.SEEK_END)
  7. f.seek(f.tell() - 1, os.SEEK_SET) # 移动到数组末尾
  8. f.truncate() # 删除末尾的']'
  9. f.write(",\n")
  10. json.dump(data, f)
  11. f.write("\n]") # 补回数组结束符

方案二:CSV格式(更适合表格分析)

  1. import csv
  2. def write_to_csv(data, filename="system_metrics.csv"):
  3. fieldnames = [
  4. "timestamp", "cpu_percent", "memory_percent",
  5. "disk_used_gb", "network_bytes_sent"
  6. ]
  7. # 首次写入创建文件并写入表头
  8. first_write = not os.path.exists(filename)
  9. with open(filename, 'a', newline='') as f:
  10. writer = csv.DictWriter(f, fieldnames=fieldnames)
  11. if first_write:
  12. writer.writeheader()
  13. # 提取关键指标(实际需根据数据结构调整)
  14. row = {
  15. "timestamp": data["timestamp"],
  16. "cpu_percent": data["cpu"]["cpu_percent"],
  17. "memory_percent": data["memory"]["memory_percent"],
  18. # 其他字段...
  19. }
  20. writer.writerow(row)

3. 完整实现示例

  1. import os
  2. import json
  3. import psutil
  4. from datetime import datetime
  5. def main():
  6. # 收集所有指标
  7. metrics = collect_all_metrics()
  8. # 写入JSON文件
  9. json_filename = "system_metrics.json"
  10. if os.path.exists(json_filename):
  11. with open(json_filename, 'r+') as f:
  12. content = f.read()
  13. content = content.rstrip('\n]') # 移除原数组结束符
  14. f.seek(0, os.SEEK_SET)
  15. f.write(content)
  16. f.write(",\n")
  17. json.dump(metrics, f)
  18. f.write("\n]")
  19. else:
  20. with open(json_filename, 'w') as f:
  21. json.dump({"metrics": [metrics]}, f)
  22. print(f"Metrics successfully written to {json_filename}")
  23. if __name__ == "__main__":
  24. main()

四、进阶优化建议

  1. 异步采集:使用asyncio实现非阻塞式数据采集
  2. 压缩存储:对历史数据采用gzip压缩
  3. 数据库存储:将数据导入InfluxDB等时序数据库
  4. 可视化集成:通过Grafana展示实时监控面板
  5. 异常检测:添加阈值告警机制

五、常见问题解决方案

  1. 权限问题:确保Python进程有访问/procioctl的权限
  2. 跨平台兼容:使用psutil的跨平台API而非直接系统调用
  3. 数据丢失防护:实现写入失败时的重试机制
  4. 性能影响:控制采集频率(建议≥1秒间隔)

六、完整代码仓库建议结构

  1. /system_monitor
  2. ├── config.py # 配置参数
  3. ├── collector.py # 数据采集模块
  4. ├── storage/
  5. ├── json_writer.py
  6. └── csv_writer.py
  7. ├── utils/
  8. └── time_utils.py
  9. └── main.py # 入口程序

通过本文介绍的方案,开发者可以快速构建一个轻量级的系统性能监控工具,既可用于本地开发环境调试,也能扩展为生产环境的监控组件。实际部署时建议结合定时任务(如cron或APScheduler)实现自动化数据采集。

相关文章推荐

发表评论

活动