Подтвердить что ты не робот

Тест нагрузки не показывает более 4 ГБ для рабочего набора PerformanceCounter

Я пытаюсь создать загрузить тест в какое-то приложение. И я хочу получить использование памяти только для процесса моего приложения. Для этого я добавил Process / Working Set в свой счетчик

введите описание изображения здесь

Проблема заключается в том, что Working Set PerformanceCounter считывает значения в байтах и ​​не учитывает значения больше, чем 4294967296, что равно 4 ГБ

введите описание изображения здесь

Но мое приложение "работает в 64-битном режиме" использует более 4 ГБ памяти
Из TaskManager видно, что он занимает около 6 ГБ, но это значение не отображается в графике нагрузки.

Итак, как создать персонализированный PerformanceCounter, чтобы действовать точно так же, как Process/Working Set, но используя Kilobytes из байтов я могу получить реальные значения. Или любое другое решение, которое позволяет мне рассчитать , сколько мое приложение использует память в тесте нагрузки.

4b9b3361

Ответ 1

Я нашел решение. Спасибо за все ваши комментарии, все они были очень полезны.

Первым шагом является нормальная установка нового PerformanceCounterCategory, самое главное - установить его как PerformanceCounterCategoryType.MultiInstance например.

var countersToCreate = new CounterCreationDataCollection();
var memoryCounterData = new CounterCreationData("Memory Usage", "Memory Usage", PerformanceCounterType.NumberOfItems64);
countersToCreate.Add(memoryCounterData);
PerformanceCounterCategory.Create("KB Memory Usage", "KB Memory Usage", PerformanceCounterCategoryType.MultiInstance, countersToCreate);

Следующим шагом должен быть простой сервис Windows или консольное приложение, которое должно читать значения для каждого процесса из process.WorkingSet64 и устанавливать их на PerformanceCounter. Это приложение или служба должны запускаться во время выполнения вашего теста нагрузки и, конечно, в режиме x64. например.

static void Main(string[] args)
{
    while (true)
    {
        Thread.Sleep(500);
        foreach (var process in Process.GetProcesses())
        {
            var memoryUsage = new PerformanceCounter("KB Memory Usage", "Memory Usage", process.ProcessName, false);
            memoryUsage.RawValue = process.WorkingSet64/1024;
        }
    }
}

Ответ 2

В соответствии с документацией PerformanceCounter.RawValue Property:

Если тип счетчика является 32-разрядным, и вы пытаетесь установить это свойство на слишком большое значение, свойство усекает значение до 32 бит.

Таким образом, вы должны использовать правильный PerformanceCounterType (те, с суффиксом 64).