У меня есть служба Windows, которая обслуживает сообщения некоторой виртуальной очереди через служебный интерфейс WCF. Я хотел разоблачить два счетчика производительности -
- Количество элементов в очереди
- Количество элементов, удаленных из очереди в секунду
Первый работает отлично, второй всегда отображается как 0 в PerfMon.exe, несмотря на то, что RawValue выглядит правильно.
Я создаю счетчики как таковые -
internal const string PERF_COUNTERS_CATEGORY = "HRG.Test.GDSSimulator";
internal const string PERF_COUNTER_ITEMSINQUEUE_COUNTER = "# Messages on queue";
internal const string PERF_COUNTER_PNR_PER_SECOND_COUNTER = "# Messages read / sec";
if (!PerformanceCounterCategory.Exists(PERF_COUNTERS_CATEGORY))
{
System.Diagnostics.Trace.WriteLine("Creating performance counter category: " + PERF_COUNTERS_CATEGORY);
CounterCreationDataCollection counters = new CounterCreationDataCollection();
CounterCreationData numberOfMessagesCounter = new CounterCreationData();
numberOfMessagesCounter.CounterHelp = "This counter provides the number of messages exist in each simulated queue";
numberOfMessagesCounter.CounterName = PERF_COUNTER_ITEMSINQUEUE_COUNTER;
numberOfMessagesCounter.CounterType = PerformanceCounterType.NumberOfItems32;
counters.Add(numberOfMessagesCounter);
CounterCreationData messagesPerSecondCounter= new CounterCreationData();
messagesPerSecondCounter.CounterHelp = "This counter provides the number of messages read from the queue per second";
messagesPerSecondCounter.CounterName = PERF_COUNTER_PNR_PER_SECOND_COUNTER;
messagesPerSecondCounter.CounterType = PerformanceCounterType.RateOfCountsPerSecond32;
counters.Add(messagesPerSecondCounter);
PerformanceCounterCategory.Create(PERF_COUNTERS_CATEGORY, "HRG Queue Simulator performance counters", PerformanceCounterCategoryType.MultiInstance,counters);
}
Затем на каждом служебном вызове я увеличиваю соответствующий счетчик, для счетчика в секунду/сек, который в настоящее время выглядит следующим образом:
messagesPerSecCounter = new PerformanceCounter();
messagesPerSecCounter.CategoryName = QueueSimulator.PERF_COUNTERS_CATEGORY;
messagesPerSecCounter.CounterName = QueueSimulator.PERF_COUNTER_PNR_PER_SECOND_COUNTER;
messagesPerSecCounter.MachineName = ".";
messagesPerSecCounter.InstanceName = this.ToString().ToLower();
messagesPerSecCounter.ReadOnly = false;
messagesPerSecCounter.Increment();
Как уже упоминалось - если я ставлю точку останова после вызова для увеличения, я вижу, что RawValue постоянно увеличивается, в соответствии с вызовами службы (довольно часто, более одного раза в секунду, я думаю) Но сам счетчик производительности остается на 0.
Счетчик производительности, обеспечивающий подсчет элементов в очереди, который реализуется одинаково (хотя я назначаю RawValue, а не Increment вызова), работает просто отлично.
Что мне не хватает?