本文目录导读:

我来介绍几种监控同步任务资源占用的Python方法:
使用psutil监控系统资源
import psutil
import time
import os
from datetime import datetime
class SyncMonitor:
def __init__(self, process_name=None, pid=None):
self.process_name = process_name
self.pid = pid
self.process = None
def find_process(self):
"""查找监控的进程"""
if self.pid:
try:
self.process = psutil.Process(self.pid)
return True
except psutil.NoSuchProcess:
return False
if self.process_name:
for proc in psutil.process_iter(['name', 'pid']):
if self.process_name in proc.info['name']:
self.process = proc
self.pid = proc.info['pid']
return True
return False
def get_resource_usage(self):
"""获取资源使用情况"""
if not self.process:
return None
try:
cpu_percent = self.process.cpu_percent(interval=1)
memory_info = self.process.memory_info()
io_counters = self.process.io_counters()
return {
'timestamp': datetime.now().isoformat(),
'pid': self.pid,
'cpu_percent': cpu_percent,
'memory_rss': memory_info.rss / 1024 / 1024, # MB
'memory_vms': memory_info.vms / 1024 / 1024, # MB
'io_read_bytes': io_counters.read_bytes / 1024 / 1024, # MB
'io_write_bytes': io_counters.write_bytes / 1024 / 1024, # MB
'num_threads': self.process.num_threads(),
'num_fds': self.process.num_fds()
}
except (psutil.NoSuchProcess, psutil.AccessDenied):
return None
def monitor_continuously(self, interval=5, duration=None):
"""持续监控"""
start_time = time.time()
records = []
while True:
if duration and (time.time() - start_time) > duration:
break
resource_data = self.get_resource_usage()
if resource_data:
records.append(resource_data)
print(f"[{resource_data['timestamp']}] "
f"CPU: {resource_data['cpu_percent']:.1f}% | "
f"内存: {resource_data['memory_rss']:.1f}MB | "
f"IO读: {resource_data['io_read_bytes']:.1f}MB | "
f"IO写: {resource_data['io_write_bytes']:.1f}MB")
time.sleep(interval)
return records
监控特定目录的IO活动
import threading
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
class SyncActivityMonitor:
def __init__(self, watch_dirs):
self.watch_dirs = watch_dirs
self.observer = Observer()
self.activity_stats = {
'created': 0,
'modified': 0,
'deleted': 0,
'moved': 0,
'bytes_transferred': 0
}
class SyncEventHandler(FileSystemEventHandler):
def __init__(self, monitor):
self.monitor = monitor
def on_created(self, event):
self.monitor.activity_stats['created'] += 1
if not event.is_directory:
try:
self.monitor.activity_stats['bytes_transferred'] += \
event.src_path.stat().st_size
except:
pass
def on_modified(self, event):
self.monitor.activity_stats['modified'] += 1
def on_deleted(self, event):
self.monitor.activity_stats['deleted'] += 1
def on_moved(self, event):
self.monitor.activity_stats['moved'] += 1
def start_monitoring(self):
"""开始监控"""
handler = self.SyncEventHandler(self)
for watch_dir in self.watch_dirs:
self.observer.schedule(handler, watch_dir, recursive=True)
self.observer.start()
def stop_monitoring(self):
"""停止监控"""
self.observer.stop()
self.observer.join()
def get_statistics(self):
"""获取统计信息"""
return self.activity_stats.copy()
结合系统资源监控的完整示例
import subprocess
import json
import signal
import sys
class ComprehensiveSyncMonitor:
def __init__(self):
self.monitors = {}
self.is_running = False
def monitor_sync_process(self, sync_command, name="sync_task"):
"""监控特定的同步命令"""
try:
process = subprocess.Popen(
sync_command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
preexec_fn=os.setsid # 创建新会话,便于终止
)
self.monitors[name] = {
'process': process,
'cpu_monitor': SyncMonitor(pid=process.pid),
'start_time': time.time()
}
return process.pid
except Exception as e:
print(f"启动同步进程失败: {e}")
return None
def monitor_all_resources(self, interval=2):
"""监控所有同步任务的资源"""
self.is_running = True
while self.is_running:
for name, monitor in self.monitors.items():
process = monitor['process']
if process.poll() is not None:
print(f"同步任务 {name} 已结束")
continue
resource_data = monitor['cpu_monitor'].get_resource_usage()
if resource_data:
print(f"\n=== {name} 资源使用 ===")
print(f"CPU使用率: {resource_data['cpu_percent']:.1f}%")
print(f"内存使用: {resource_data['memory_rss']:.1f} MB")
print(f"线程数: {resource_data['num_threads']}")
# 检查资源是否异常
if resource_data['cpu_percent'] > 80:
print(f"警告: {name} CPU使用率过高!")
if resource_data['memory_rss'] > 500: # 500MB
print(f"警告: {name} 内存使用过高!")
time.sleep(interval)
def stop_all(self):
"""停止所有监控"""
self.is_running = False
for name, monitor in self.monitors.items():
process = monitor['process']
if process.poll() is None:
# 终止进程组
os.killpg(os.getpgid(process.pid), signal.SIGTERM)
def log_statistics(self, duration=60):
"""记录统计信息到文件"""
import csv
start_time = time.time()
records = []
while (time.time() - start_time) < duration:
for name, monitor in self.monitors.items():
resource_data = monitor['cpu_monitor'].get_resource_usage()
if resource_data:
records.append({
**resource_data,
'task_name': name
})
time.sleep(5)
# 保存到CSV
if records:
filename = f"sync_monitor_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
with open(filename, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=records[0].keys())
writer.writeheader()
writer.writerows(records)
print(f"监控数据已保存到 {filename}")
# 使用示例
if __name__ == "__main__":
# 创建监控器
monitor = ComprehensiveSyncMonitor()
# 启动同步任务(示例:rsync)
pid = monitor.monitor_sync_process(
"rsync -avz /source/dir/ /destination/dir/",
"rsync_backup"
)
if pid:
print(f"同步任务已启动,PID: {pid}")
try:
# 持续监控30秒
monitor.log_statistics(duration=30)
except KeyboardInterrupt:
print("\n收到中断信号,停止监控...")
finally:
monitor.stop_all()
Web界面监控(可选)
from flask import Flask, jsonify
import threading
app = Flask(__name__)
monitor = SyncMonitor(process_name="rsync")
@app.route('/api/sync/status')
def get_sync_status():
resource_data = monitor.get_resource_usage()
if resource_data:
return jsonify(resource_data)
return jsonify({'error': '同步进程未运行'}), 404
@app.route('/api/sync/history')
def get_sync_history():
# 从数据库或文件中读取历史数据
pass
def run_web_server():
app.run(host='0.0.0.0', port=5000)
# 启动Web服务器
web_thread = threading.Thread(target=run_web_server, daemon=True)
web_thread.start()
安装依赖
pip install psutil watchdog flask
使用建议
- 定期记录:将资源使用情况记录到日志文件
- 告警机制:设置阈值,当资源使用异常时发送告警
- 图表展示:结合matplotlib或Grafana生成可视化图表
- 定期清理:定期清理历史监控数据
这个监控系统可以帮助您实时了解同步任务的资源使用情况,及时发现并解决性能问题。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播