// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 // // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! namespace Admin.NET.Core; /// /// 运行时监控器 /// public class RuntimeMonitor : IDisposable { private readonly Process _currentProcess; private readonly ConcurrentQueue _snapshots; private readonly Timer? _monitorTimer; private readonly object _lockObject = new(); private readonly int _maxSnapshotCount; private volatile bool _isDisposed; private DateTime _lastCpuTime; private TimeSpan _lastTotalProcessorTime; /// /// 构造函数 /// /// 监控间隔,默认5秒 /// 最大快照数量,默认1000 public RuntimeMonitor(TimeSpan? monitorInterval = null, int maxSnapshotCount = 1000) { _currentProcess = Process.GetCurrentProcess(); _snapshots = new ConcurrentQueue(); _maxSnapshotCount = maxSnapshotCount; MonitorInterval = monitorInterval ?? TimeSpan.FromSeconds(5); // 初始化CPU时间基准 _lastCpuTime = DateTime.UtcNow; _lastTotalProcessorTime = _currentProcess.TotalProcessorTime; // 创建定时器但不立即启动 _monitorTimer = new Timer(CollectSnapshot, null, Timeout.Infinite, Timeout.Infinite); } /// /// 监控间隔 /// public TimeSpan MonitorInterval { get; } /// /// 是否正在监控 /// public bool IsMonitoring { get; private set; } /// /// 快照历史记录数量 /// public int SnapshotCount => _snapshots.Count; /// /// 监控开始时间 /// public DateTime? MonitorStartTime { get; private set; } /// /// 强制垃圾回收 /// /// GC代数,-1表示全部代 /// GC模式 public static void ForceGarbageCollection(int generation = -1, GCCollectionMode mode = GCCollectionMode.Default) { if (generation == -1) { GC.Collect(); } else { GC.Collect(generation, mode); } GC.WaitForPendingFinalizers(); GC.Collect(); } /// /// 获取内存压力信息 /// /// 内存压力信息 public static string GetMemoryPressureInfo() { var info = GC.GetGCMemoryInfo(); return $"总内存: {info.TotalAvailableMemoryBytes / 1024 / 1024} MB, " + $"高内存负载阈值: {info.HighMemoryLoadThresholdBytes / 1024 / 1024} MB, " + $"堆大小: {info.HeapSizeBytes / 1024 / 1024} MB, " + $"内存负载: {info.MemoryLoadBytes / 1024 / 1024} MB"; } /// /// 开始监控 /// public void StartMonitoring() { if (IsMonitoring || _isDisposed) { return; } lock (_lockObject) { if (IsMonitoring || _isDisposed) { return; } IsMonitoring = true; MonitorStartTime = DateTime.Now; // 立即收集一次快照 CollectSnapshot(null); // 启动定时器 _monitorTimer?.Change(MonitorInterval, MonitorInterval); } } /// /// 停止监控 /// public void StopMonitoring() { if (!IsMonitoring) { return; } lock (_lockObject) { if (!IsMonitoring) { return; } IsMonitoring = false; _monitorTimer?.Change(Timeout.Infinite, Timeout.Infinite); } } /// /// 获取当前性能快照 /// /// 当前性能快照 public PerformanceSnapshot GetCurrentSnapshot() { return CreateSnapshot(); } /// /// 获取最新的性能快照 /// /// 最新的性能快照,如果没有则返回null public PerformanceSnapshot? GetLatestSnapshot() { return _snapshots.TryPeek(out var snapshot) ? snapshot : null; } /// /// 获取所有性能快照 /// /// 性能快照列表 public List GetAllSnapshots() { return [.. _snapshots]; } /// /// 获取指定时间范围内的快照 /// /// 时间范围 /// 快照列表 public List GetSnapshotsInTimeRange(TimeSpan timeRange) { var cutoffTime = DateTime.Now - timeRange; return [.. _snapshots.Where(s => s.Timestamp >= cutoffTime)]; } /// /// 分析性能趋势 /// /// 计数器类型 /// 分析时间范围,null表示分析所有数据 /// 性能趋势分析结果 public PerformanceTrend AnalyzeTrend(PerformanceCounterType counterType, TimeSpan? timeRange = null) { var snapshots = timeRange.HasValue ? GetSnapshotsInTimeRange(timeRange.Value) : GetAllSnapshots(); if (snapshots.Count == 0) { return new PerformanceTrend { CounterType = counterType, SampleCount = 0, AnalysisTimespan = timeRange ?? TimeSpan.Zero }; } var values = snapshots.Select(s => GetCounterValue(s, counterType)).ToList(); var trend = new PerformanceTrend { CounterType = counterType, CurrentValue = values.LastOrDefault(), AverageValue = values.Average(), MinValue = values.Min(), MaxValue = values.Max(), SampleCount = values.Count, AnalysisTimespan = timeRange ?? (snapshots.Last().Timestamp - snapshots.First().Timestamp) }; // 计算标准差 var variance = values.Select(v => Math.Pow(v - trend.AverageValue, 2)).Average(); trend.StandardDeviation = Math.Sqrt(variance); // 计算趋势(简单线性回归的斜率) if (values.Count >= 2) { var n = values.Count; var sumX = Enumerable.Range(0, n).Sum(); var sumY = values.Sum(); var sumXy = values.Select((v, i) => i * v).Sum(); var sumX2 = Enumerable.Range(0, n).Select(i => i * i).Sum(); trend.Trend = ((n * sumXy) - (sumX * sumY)) / ((n * sumX2) - (sumX * sumX)); } return trend; } /// /// 清空所有快照 /// public void ClearSnapshots() { while (_snapshots.TryDequeue(out _)) { } } /// /// 获取性能摘要报告 /// /// 性能摘要字符串 public string GetPerformanceSummary() { var current = GetCurrentSnapshot(); var cpuTrend = AnalyzeTrend(PerformanceCounterType.CpuUsage, TimeSpan.FromMinutes(5)); var memoryTrend = AnalyzeTrend(PerformanceCounterType.MemoryUsage, TimeSpan.FromMinutes(5)); return $"运行时性能摘要:\n" + $" CPU使用率: {current.CpuUsage:F1}% (5分钟平均: {cpuTrend.AverageValue:F1}%)\n" + $" 内存使用: {current.MemoryUsage / 1024 / 1024} MB (托管内存: {current.ManagedMemory / 1024 / 1024} MB)\n" + $" GC收集: Gen0={current.GcGen0Collections}, Gen1={current.GcGen1Collections}, Gen2={current.GcGen2Collections}\n" + $" 线程数: {current.ThreadCount}, 句柄数: {current.HandleCount}\n" + $" 运行时间: {current.ProcessUptime:dd\\.hh\\:mm\\:ss}\n" + $" 监控状态: {(IsMonitoring ? "运行中" : "已停止")}, 快照数: {SnapshotCount}"; } /// /// 释放资源 /// public void Dispose() { if (_isDisposed) { return; } _isDisposed = true; StopMonitoring(); _monitorTimer?.Dispose(); _currentProcess?.Dispose(); GC.SuppressFinalize(this); } /// /// 获取计数器值 /// /// 性能快照 /// 计数器类型 /// 计数器值 private static double GetCounterValue(PerformanceSnapshot snapshot, PerformanceCounterType counterType) { return counterType switch { PerformanceCounterType.CpuUsage => snapshot.CpuUsage, PerformanceCounterType.MemoryUsage => snapshot.MemoryUsage, PerformanceCounterType.GcCollections => snapshot.GcGen0Collections + snapshot.GcGen1Collections + snapshot.GcGen2Collections, PerformanceCounterType.ThreadCount => snapshot.ThreadCount, PerformanceCounterType.HandleCount => snapshot.HandleCount, _ => 0 }; } /// /// 收集性能快照 /// /// 定时器状态 private void CollectSnapshot(object? state) { if (_isDisposed) { return; } try { var snapshot = CreateSnapshot(); _snapshots.Enqueue(snapshot); // 限制快照数量 while (_snapshots.Count > _maxSnapshotCount) { _snapshots.TryDequeue(out _); } } catch (Exception ex) { // 记录异常但继续监控 Debug.WriteLine($"Failed to collect performance snapshot: {ex.Message}"); } } /// /// 创建性能快照 /// /// 性能快照 private PerformanceSnapshot CreateSnapshot() { _currentProcess.Refresh(); // 计算CPU使用率 var currentTime = DateTime.UtcNow; var currentTotalProcessorTime = _currentProcess.TotalProcessorTime; var cpuUsage = 0.0; var timeDelta = currentTime - _lastCpuTime; var cpuTimeDelta = currentTotalProcessorTime - _lastTotalProcessorTime; if (timeDelta.TotalMilliseconds > 0) { cpuUsage = cpuTimeDelta.TotalMilliseconds / (Environment.ProcessorCount * timeDelta.TotalMilliseconds) * 100; cpuUsage = Math.Max(0, Math.Min(100, cpuUsage)); // 限制在0-100%范围内 } _lastCpuTime = currentTime; _lastTotalProcessorTime = currentTotalProcessorTime; return new PerformanceSnapshot { Timestamp = currentTime, CpuUsage = cpuUsage, MemoryUsage = _currentProcess.WorkingSet64, PrivateMemorySize = _currentProcess.PrivateMemorySize64, VirtualMemorySize = _currentProcess.VirtualMemorySize64, WorkingSet = _currentProcess.WorkingSet64, GcGen0Collections = GC.CollectionCount(0), GcGen1Collections = GC.CollectionCount(1), GcGen2Collections = GC.CollectionCount(2), ManagedMemory = GC.GetTotalMemory(false), ThreadCount = _currentProcess.Threads.Count, HandleCount = _currentProcess.HandleCount, UserProcessorTime = _currentProcess.UserProcessorTime, PrivilegedProcessorTime = _currentProcess.PrivilegedProcessorTime, TotalProcessorTime = _currentProcess.TotalProcessorTime, ProcessUptime = DateTime.Now - _currentProcess.StartTime }; } } /// /// 性能指标快照 /// public record PerformanceSnapshot { /// /// 快照时间 /// public DateTime Timestamp { get; set; } /// /// CPU使用率百分比 /// public double CpuUsage { get; set; } /// /// 内存使用量(字节) /// public long MemoryUsage { get; set; } /// /// 私有内存使用量(字节) /// public long PrivateMemorySize { get; set; } /// /// 虚拟内存使用量(字节) /// public long VirtualMemorySize { get; set; } /// /// 工作集大小(字节) /// public long WorkingSet { get; set; } /// /// GC代0收集次数 /// public int GcGen0Collections { get; set; } /// /// GC代1收集次数 /// public int GcGen1Collections { get; set; } /// /// GC代2收集次数 /// public int GcGen2Collections { get; set; } /// /// 托管内存使用量(字节) /// public long ManagedMemory { get; set; } /// /// 线程数量 /// public int ThreadCount { get; set; } /// /// 句柄数量 /// public int HandleCount { get; set; } /// /// 用户处理器时间 /// public TimeSpan UserProcessorTime { get; set; } /// /// 特权处理器时间 /// public TimeSpan PrivilegedProcessorTime { get; set; } /// /// 总处理器时间 /// public TimeSpan TotalProcessorTime { get; set; } /// /// 进程运行时间 /// public TimeSpan ProcessUptime { get; set; } } /// /// 性能趋势分析结果 /// public record PerformanceTrend { /// /// 计数器类型 /// public PerformanceCounterType CounterType { get; set; } /// /// 当前值 /// public double CurrentValue { get; set; } /// /// 平均值 /// public double AverageValue { get; set; } /// /// 最小值 /// public double MinValue { get; set; } /// /// 最大值 /// public double MaxValue { get; set; } /// /// 变化趋势(正数表示上升,负数表示下降) /// public double Trend { get; set; } /// /// 标准差 /// public double StandardDeviation { get; set; } /// /// 样本数量 /// public int SampleCount { get; set; } /// /// 分析时间范围 /// public TimeSpan AnalysisTimespan { get; set; } } /// /// 性能计数器类型枚举 /// public enum PerformanceCounterType { /// /// CPU使用率 /// CpuUsage = 1, /// /// 内存使用量 /// MemoryUsage = 2, /// /// GC收集次数 /// GcCollections = 3, /// /// 线程数量 /// ThreadCount = 4, /// /// 句柄数量 /// HandleCount = 5 }