/// <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);
        }
Example #2
0
            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);
        }