/// <summary> /// 获取系统负载率 /// </summary> /// <returns></returns> public static LoadAverage GetLoadAverage() { try { string std = ""; string err = ""; string cmd = "top - bn1 | awk '/average:/ '"; var ret = LinuxShell.Run(cmd, 1000, out std, out err); if (ret) { if (!string.IsNullOrEmpty(std)) { int pos_start = std.IndexOf("load average:", StringComparison.Ordinal); if (pos_start > 0) { std = std.Substring(pos_start + "load average:".Length).Trim(); } string[] loadaverageinfo = std.Split(','); if (loadaverageinfo.Length == 3) { var loadAverage = new LoadAverage(); loadAverage.LoadAverageMin1 = float.Parse((loadaverageinfo[0]).Trim()); loadAverage.LoadAverageMin5 = float.Parse((loadaverageinfo[1]).Trim()); loadAverage.LoadAverageMin15 = float.Parse((loadaverageinfo[2]).Trim()); return(loadAverage); } } if (!string.IsNullOrEmpty(err)) { int pos_start = err.IndexOf("load average:", StringComparison.Ordinal); if (pos_start > 0) { err = err.Substring(pos_start + "load average:".Length).Trim(); } string[] loadaverageinfo = err.Split(','); if (loadaverageinfo.Length == 3) { var loadAverage = new LoadAverage(); loadAverage.LoadAverageMin1 = float.Parse((loadaverageinfo[0]).Trim()); loadAverage.LoadAverageMin5 = float.Parse((loadaverageinfo[1]).Trim()); loadAverage.LoadAverageMin15 = float.Parse((loadaverageinfo[2]).Trim()); return(loadAverage); } } } } catch { return(null); } return(null); }
private async Task Main(CancellationToken cancellationToken) { var last1 = new List <ProcessorTime>(); var last5 = new List <ProcessorTime>(); var last15 = new List <ProcessorTime>(); using var performanceCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); while (!cancellationToken.IsCancellationRequested) { // remove oldest, if older than 15 minutes last1.RemoveAll(t => (DateTime.UtcNow - t.When) > TimeSpan.FromMinutes(1)); last5.RemoveAll(t => (DateTime.UtcNow - t.When) > TimeSpan.FromMinutes(5)); last15.RemoveAll(t => (DateTime.UtcNow - t.When) > TimeSpan.FromMinutes(15)); // add current var current = new ProcessorTime() { When = DateTime.UtcNow, Percentage = performanceCounter.NextValue() / 100 * Environment.ProcessorCount, }; last15.Add(current); last5.Add(current); last1.Add(current); // update state if (last1.Count > 2) { lock (StateLock) { State = new LoadAverage() { OneMinute = LoadAverageFrom(last1), FiveMinutes = LoadAverageFrom(last5), FifteenMinutes = LoadAverageFrom(last15), }; } } // delay and wait for next cycle try { await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } catch (TaskCanceledException) { // ignore } } CancellationTokenSource.Dispose(); }
private static DateTime GetUpdatedTimeFrameStart(LoadAverage loadAverageType, DateTime timeframeStart) { switch (loadAverageType) { case (LoadAverage.Minutes): return(timeframeStart.AddMinutes(-1)); case (LoadAverage.Hours): return(timeframeStart.AddHours(-1)); default: throw new InvalidEnumArgumentException(); } }
public List <AverageLoad> GetAverageLoads(string serverName, LoadAverage loadAverageType) { if (!ServerRecords.ContainsKey(serverName)) { return(null); } var serverLoadDataRecords = ServerRecords[serverName]; var currentTime = Clock.Now; var timeframeStart = currentTime.AddSeconds(-currentTime.Second); var averageLoads = new List <AverageLoad>(); for (var i = 1; i < (int)loadAverageType + 1; i++) { var timeframeEnd = timeframeStart.AddSeconds(-1); timeframeStart = GetUpdatedTimeFrameStart(loadAverageType, timeframeStart); var relevantRecordsInTimeFrame = serverLoadDataRecords .Where(l => l.RecordedDate >= timeframeStart && l.RecordedDate <= timeframeEnd) .ToList(); var relevantCpuLoads = relevantRecordsInTimeFrame .Select(r => r.CpuLoad) .ToList(); var relevantRamLoads = relevantRecordsInTimeFrame .Select(r => r.RamLoad) .ToList(); averageLoads.Add(new AverageLoad { RangeStart = timeframeStart, RangeEnd = timeframeEnd, AverageCpuLoad = relevantCpuLoads.Any() ? relevantCpuLoads.Average() : 0, AverageRamLoad = relevantRamLoads.Any() ? relevantRamLoads.Average() : 0 }); } return(averageLoads); }