c # — монитор процессов IIS для отображения процессов IIS w3wp.exe с их процессами PHP (php-cgi.exe)

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

Мне удалось сделать это без больших проблем с помощью этих двух команд:

using (var srvman = new ServerManager())
{
workerProcesses = srvman.WorkerProcesses;
}

а также

processes = Process.GetProcesses().Where(processItem => processItem.ProcessName.Contains("w3wp") || processItem.ProcessName.Contains("php-cgi"))

Первый возвращает пулы запущенных приложений с идентификаторами процессов, а второй возвращает информацию о процессах из системы (поэтому здесь я получаю использование ЦП и памяти). Объединение этих двух сведений дает мне почти то, что я хочу. Единственным исключением являются приложения PHP, которые работают на IIS.

Для приложений PHP, php-cgi.exe создаются процессы, которые мне нужно соотнести с рабочим процессом пула приложений IIS. Есть ли у вас идеи, как подключиться php-cgi.exe процессы к их w3wp.exe родители?

Вот пример вывода, который я хотел бы произвести:

1x w3wp.exe for site.com is using 15MB memory
4x php-cgi.exe is using 4x 15MB = 60MB memory

Я планирую суммировать эту информацию (которая в этом сценарии будет использовать 75 МБ памяти для site.com).

0

Решение

Вы можете получить PID родительского процесса, используя немного P / Invoke как описано Саймоном Мурье. Это недорогая операция, которая свяжет список всех php-cgi процесс обратно к своим создателям.

using (var srvman = new ServerManager())
{
var procs = from worker in srvman.WorkerProcesses
let workerProcess = Process.GetProcessById(worker.ProcessId)
join cgi in Process.GetProcessesByName("php-cgi")
on workerProcess.Id equals ParentProcessUtilities.GetParentProcess(cgi.Handle).Id
into childProcesses
select new
{
Worker = worker,
WorkerProcess = workerProcess,
Children = childProcesses,
TotalMemoryUse = workerProcess.PrivateMemorySize64
+ childProcesses.Sum(p => p.PrivateMemorySize64)
};

foreach (var proc in procs)
{
Console.WriteLine("Worker {0}:{1} using {2} total bytes", proc.Worker.AppPoolName,
proc.Worker.ProcessId, proc.TotalMemoryUse);

foreach (var child in proc.Children)
{
Console.WriteLine("\tphp-cgi process {0} using {1} bytes", child.Id, child.PrivateMemorySize64);
}
}
}

Выход

C: \ drop> phpProcessTest.exe
Работник DefaultAppPool: 4396 с использованием 61530112 байтов
процесс php-cgi 3540 с использованием 7024640 байт
процесс php-cgi 3144 с использованием 6389760 байт
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]