Я хотел бы отобразить некоторую статистику памяти (рабочий набор, GC и т. Д.) На веб-странице с помощью счетчиков производительности .NET/Process. К сожалению, если на этом сервере есть несколько пулов приложений, они различаются с использованием индекса (# 1, # 2 и т. Д.), Но я не знаю, как сопоставить идентификатор процесса (который у меня есть) с этим индексом #xx. Есть ли программный способ (с веб-страницы ASP.NET)?Получить имя экземпляра счетчика производительности (w3wp # XX) из рабочего процесса ASP.NET ID
ответ
Первый удар по Google:
Multiple CLR performance counters appear that have names that resemble "W3wp#1"
При многократном работник ASP.NET обрабатывает работают, среды CLR счетчики (CLR) производительность будет иметь имена, которые напоминают «w3wp # 1 "или " W3sp # 2 "и так далее. Это было исправлено в .NET Framework 2.0, чтобы включить счетчик с именем Process ID в .NET Объект производительности CLR Memory. Этот счетчик отображает идентификатор процесса для экземпляра . Вы можете использовать этот счетчик для , чтобы определить счетчик производительности CLR , который связан с процессом.
Также KB 281884:
По умолчанию Performance Monitor (Perfmon.msc) отображает несколько процессов, которые имеют такое же имя, перечисляющие процессы в следующим образом:
Процесс № 1 Процесс № 2 Процесс № 3
Монитор производительности также может отображать эти процессы путем добавления в идентификатор процесса (PID) с именем в следующим образом:
Process_PID
На самом деле это неправильно - похоже, что именованием является Process, Process # 1, Process # 2. Вот один из них с постфиксным. – 2014-09-27 21:12:31
private static string GetProcessInstanceName(int pid)
{
PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");
string[] instances = cat.GetInstanceNames();
foreach (string instance in instances)
{
using (PerformanceCounter cnt = new PerformanceCounter("Process",
"ID Process", instance, true))
{
int val = (int) cnt.RawValue;
if (val == pid)
{
return instance;
}
}
}
throw new Exception("Could not find performance counter " +
"instance name for current process. This is truly strange ...");
}
Я думаю, что это быстрее: Процесс p = Process.tGetProcessById (pid); string instance = Process.ProcessName; – pistacchio 2009-11-18 11:23:36
Пример по чиру не работает в конкретном случае - когда у вас есть две версии одной и той же программы, называются одинаковыми, а одна не является .net, и вы запускаете версию .net после версии non.net. Версия .Net будет называться applicaion # 1, но когда вы получаете доступ к счетчикам перформанса CLR, используя это имя, имена экземпляров на счетчике имеют имя с номером # 1, поэтому вы получаете сбои.
Ник.
Несмотря на то, что изменение настроек реестра выглядит довольно просто, к сожалению, большинство из нас не имеют прав на это на сервере (или мы не хотим его трогать!). В этом случае существует небольшое обходное решение. Я написал об этом here.
Я знаю, что на это был дан ответ, но только ради полного рабочего кода. Я отправляю это решение.Обратите внимание на этот код, основанный на методе, представленном M4N в этой цепочке:
public static long GetProcessPrivateWorkingSet64Size(int process_id)
{
long process_size = 0;
Process process = Process.GetProcessById(process_id);
if (process == null) return process_size;
string instanceName = GetProcessInstanceName(process.Id);
var counter = new PerformanceCounter("Process", "Working Set - Private", instanceName, true);
process_size = Convert.ToInt32(counter.NextValue())/1024;
return process_size;
}
public static string GetProcessInstanceName(int process_id)
{
PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");
string[] instances = cat.GetInstanceNames();
foreach (string instance in instances)
{
using (PerformanceCounter cnt = new PerformanceCounter("Process", "ID Process", instance, true))
{
int val = (int)cnt.RawValue;
if (val == process_id)
return instance;
}
}
throw new Exception("Could not find performance counter ");
}
Кроме того, если вы хотите, чтобы получить общий объем памяти нескольких экземпляров одного и того же процесса используют вышеуказанные методы следующим текстом:
public static long GetPrivateWorkingSetForAllProcesses(string ProcessName)
{
long totalMem = 0;
Process[] process = Process.GetProcessesByName(ProcessName);
foreach (Process proc in process)
{
long memsize = GetProcessPrivateWorkingSet64Size(proc.Id);
totalMem += memsize;
}
return totalMem;
}
- 1. Имя экземпляра счетчика производительности против имени процесса
- 2. имя экземпляра счетчика производительности sharepoit с [ACL]
- 3. Значение счетчика производительности ASP.NET
- 4. Получить имя исполнительного рабочего процесса - CRM 4
- 5. Имя экземпляра C# для использования счетчика производительности сетевого интерфейса
- 6. Поиск экземпляра рабочего процесса с этапа рабочего процесса
- 7. Загрузите экземпляр рабочего процесса с внешним ID
- 8. Счетчики производительности модели Model Number Имя экземпляра
- 9. Выполнение рабочего процесса из другого рабочего процесса
- 10. Получить тип/имя текущего рабочего процесса из-за действия
- 11. В редакторе рабочего процесса конструктора sharepoint, как получить имя пользователя инициатора рабочего процесса?
- 12. Состояние рабочего процесса, не изменяющееся в asp.net
- 13. asp.net 4 примера рабочего процесса
- 14. Чтение w3wp .Net счетчиков производительности экземпляров программно
- 15. Получение нуля из счетчика производительности
- 16. Приостановка экземпляра рабочего процесса в Fault Handler
- 17. получить имя процесса из идентификатора процесса (win32)
- 18. Выход из рабочего процесса?
- 19. Получить NodeRef из задач рабочего процесса Alfresco
- 20. Получить задачи рабочего процесса из Documentum
- 21. Получить/Установить переменную рабочего процесса из uiTypeEditor
- 22. Запуск последовательного рабочего процесса из рабочего процесса состояния
- 23. Получить соединение TFS в редакторе параметров рабочего процесса рабочего процесса
- 24. Рабочий процесс Windows: запуск отдельного рабочего процесса из рабочего потока
- 25. Повторное создание экземпляра рабочего процесса с тем же идентификатором экземпляра
- 26. Доступ к текущему HttpContext из рабочего процесса?
- 27. Ограничения счетчика производительности Windows
- 28. Невозможно увидеть счетчики производительности производительности рабочего стола
- 29. Запись счетчика производительности ASP.NET, инструмент отчетности
- 30. Как проинформировать значения счетчика производительности ASP.NET/sec?
Это сообщение в блоге, в котором подробно обсуждается этот сценарий: http://weblog.west-wind.com/posts/2014/Sep/27/Capturing-Performance-Counter-Data-for-a-Process-by -Process-Id. В основном вам нужно использовать другой счетчик производительности для получения имен экземпляров, а затем запустить счетчики процессов с этим именем. – 2014-09-27 21:13:16