Я пытаюсь написать небольшой монитор процесса 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).
Вы можете получить 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 байт
Других решений пока нет …