Как контролировать использование компьютера процессором, памятью и диском IIS Appool в C #? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь написать службу Windows, которая будет использоваться для мониторинга памяти, процессора и текущего числа запросов пулов приложений IIS с использованием C #. То, что у меня есть в данный момент (показано ниже), на самом деле не делает этого в данный момент.

Код, показанный ниже, правильно объединяет текущие приложения, размещенные в IIS, но когда вы пытаетесь получить счетчик производительности «время процессора», «память», возникает недопустимое исключение операции. Похоже, чего-то не хватает. Любая помощь будет очень ценится. Спасибо.

using Microsoft.Web.Administration;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace ResourceMonitor.Infrastructure
{
    public class PerformanceAggregator
    {
        private static readonly List<PerformanceCounterCategory> Processes = new List<PerformanceCounterCategory>();
        private static readonly List<string> Instances = new List<string>();
        private static string _category = "Web Service";

        private static readonly Dictionary<string, List<PerformanceCounter>> Resources = new Dictionary<string, List<PerformanceCounter>>();


        private static void InitializeCounters()
        {
            if (!Instances.Any())
                return;

            foreach (var instance in Instances)
            {              

                var resources = new List<PerformanceCounter>();
                // Memory, "% Committed Bytes In Use"
                if (PerformanceCounterCategory.InstanceExists(instance, _category))
                {
                    var cpuTime = new PerformanceCounter(_category, "% Processor Time", instance);
                    cpuTime.NextValue();
                    resources.Add(cpuTime);
                }

                if (PerformanceCounterCategory.InstanceExists(instance, _category))
                {
                    var memory = new PerformanceCounter(_category, "% Committed Bytes In Use", instance);
                    memory.NextValue();
                    resources.Add(memory);
                }

                if (PerformanceCounterCategory.InstanceExists(instance, @"ASP.NET"))
                {
                    var requests = new PerformanceCounter(@"ASP.NET", "requests current", instance, true);
                    requests.NextValue();
                    resources.Add(requests);
                }

                //add instances to resources dictionary
                Resources.Add(instance, resources);
            }
        }

        private static void LoadInstances()
        {
            if (!Processes.Any())
            {
                LoadPerformanceCategory(_category);
            }

            foreach (var counterCategory in Processes)
            {
                var instances = counterCategory.GetInstanceNames().ToList();
                instances = instances.Where(a => a.IndexOf("_") != 0).ToList();

                if(instances.Any())
                    Instances.AddRange(instances);
            }
        }

        private static void LoadPerformanceCategory(string category)
        {

            var categories = PerformanceCounterCategory
                .GetCategories()
                .Where(a => a.CategoryName.Contains(category))
                .ToList();

            if (categories.Any())
            {
                Processes.AddRange(categories);
            }
        }

        public static bool Load(string service)
        {
            try
            {
                _category = service;
               LoadPerformanceCategory(service);
               LoadInstances();

                //initialize counters
                InitializeCounters();
                return true;
            }
            catch (Exception e)
            {
                throw;
            }

        }

        public static List<Resource> PoolResource()
        {
            var computedResources = new List<Resource>();
            if(Resources != null && Resources.Any())
            {
                foreach (var resource in Resources)
                {
                    var computedResource = new Resource
                    {
                        Name = resource.Key,
                        RecordedAt = DateTime.Now
                    };

                    foreach (var counter in resource.Value)
                    {
                        var value = counter.NextValue();
                        if (counter.CategoryName == "Process")
                        {
                            value = (value / Environment.ProcessorCount);
                            computedResource.CurrentCpu = value;
                        }

                        if (counter.CategoryName == "Memory")
                        {
                            value = counter.NextValue();
                            computedResource.CurrentMemory = value;
                        }

                        if (counter.CategoryName != "ASP.NET")
                            continue;

                        value = counter.NextValue();
                        computedResource.RequestCount = value;
                    }
                    computedResources.Add(computedResource);
                }
            }
            return computedResources;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...