Счетчик типа RateOfCountsPerSecond32 всегда показывает 0

У меня есть сервис окон, который обслуживает сообщения некоторой виртуальной очереди через сервисный интерфейс WCF. Я хотел представить два счетчика производительности -

  1. Количество объектов на очереди
  2. Количество объектов, удаленных из очереди в секунду

Первый хорошо работает, второй всегда показывает 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();

Как упомянуто - если я поместил точку останова после того, как вызов для постепенного увеличения I видит RawValue, постоянно увеличивающийся в последовательности с вызовами к сервису (справедливо часто, несколько раз секунда, я думал бы), Но сам счетчик производительности остается на 0.

Счетчик производительности, обеспечивающий количество объектов на 'очереди', которая реализована таким же образом (хотя я присваиваю RawValue, вместо того, чтобы назвать Инкремент), работает просто великолепно.

Что я пропускаю?

13
задан Yossi Dahan 10 February 2010 в 15:56
поделиться