TRM-coding | 106204b | 2025-06-28 00:37:46 +0800 | [diff] [blame] | 1 | from sqlalchemy.orm import sessionmaker |
| 2 | from sqlalchemy import create_engine |
| 3 | from app.models.gpu_usage import GpuUsage |
| 4 | import logging |
| 5 | |
| 6 | class GpuWriter: |
| 7 | def __init__(self, database_url): |
| 8 | """ |
| 9 | 初始化 GpuWriter |
| 10 | :param database_url: 数据库连接URL |
| 11 | """ |
| 12 | self.engine = create_engine(database_url) |
| 13 | self.Session = sessionmaker(bind=self.engine) |
| 14 | |
| 15 | def write_gpu_usage(self, gpu_id, gpu_usage, gpu_memory_usage): |
| 16 | """ |
| 17 | 写入GPU使用情况到数据库 |
| 18 | :param gpu_id: GPU编号 |
| 19 | :param gpu_usage: GPU使用率(百分比) |
| 20 | :param gpu_memory_usage: GPU内存用量(MB) |
| 21 | :return: bool 是否写入成功 |
| 22 | """ |
| 23 | session = self.Session() |
| 24 | try: |
| 25 | gpu_record = GpuUsage( |
| 26 | gpu_id=gpu_id, |
| 27 | gpu_usage=gpu_usage, |
| 28 | gpu_memory_usage=gpu_memory_usage |
| 29 | ) |
| 30 | session.add(gpu_record) |
| 31 | session.commit() |
| 32 | return True |
| 33 | except Exception as e: |
| 34 | session.rollback() |
| 35 | logging.error(f"写入GPU使用情况失败: {e}") |
| 36 | return False |
| 37 | finally: |
| 38 | session.close() |
| 39 | |
| 40 | def get_latest_gpu_usage(self, limit=100): |
| 41 | """ |
| 42 | 获取最新的GPU使用情况记录 |
| 43 | :param limit: 获取记录条数,默认100条 |
| 44 | :return: list 包含GPU使用记录的字典列表 |
| 45 | """ |
| 46 | session = self.Session() |
| 47 | try: |
| 48 | records = session.query(GpuUsage)\ |
| 49 | .order_by(GpuUsage.timestamp.desc())\ |
| 50 | .limit(limit)\ |
| 51 | .all() |
| 52 | |
| 53 | result = [] |
| 54 | for record in records: |
| 55 | result.append({ |
| 56 | 'id': record.id, |
| 57 | 'gpu_id': record.gpu_id, |
| 58 | 'gpu_usage': record.gpu_usage, |
| 59 | 'gpu_memory_usage': record.gpu_memory_usage, |
| 60 | 'timestamp': record.timestamp.isoformat() if record.timestamp else None |
| 61 | }) |
| 62 | |
| 63 | return result |
| 64 | except Exception as e: |
| 65 | logging.error(f"获取GPU使用情况失败: {e}") |
| 66 | return [] |
| 67 | finally: |
| 68 | session.close() |