IIS 进程监视器列出 IIS w3wp.exe 进程及其 PHP (php-cgi.exe) 进程
IIS process monitor to list IIS w3wp.exe processes with their PHP (php-cgi.exe) processes
我正在尝试编写小型 IIS 进程监视器(CPU 和内存使用情况),它对系统来说应该尽可能轻。我只需要 IIS 应用程序池名称、当前内存使用情况和当前 CPU 使用情况。
我使用这两个命令成功地做到了,没有遇到更大的问题:
using (var srvman = new ServerManager())
{
workerProcesses = srvman.WorkerProcesses;
}
和
processes = Process.GetProcesses().Where(processItem => processItem.ProcessName.Contains("w3wp") || processItem.ProcessName.Contains("php-cgi"))
第一个 returns 运行 具有进程 ID 的应用程序池,第二个是从系统返回进程信息(所以这里是我获得 CPU 和内存使用情况的地方) .加入这两个信息给了我几乎我想要的。一个例外是 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
我打算汇总这些信息(在这种情况下,site.com 的内存使用量为 75 MB)。
您可以使用一点P/Invoke as described by Simon Mourier 来获取父进程的PID。这样做是一种低成本操作,并且会将所有 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
Worker DefaultAppPool:4396 using 61530112 total bytes
php-cgi process 3540 using 7024640 bytes
php-cgi process 3144 using 6389760 bytes
我正在尝试编写小型 IIS 进程监视器(CPU 和内存使用情况),它对系统来说应该尽可能轻。我只需要 IIS 应用程序池名称、当前内存使用情况和当前 CPU 使用情况。
我使用这两个命令成功地做到了,没有遇到更大的问题:
using (var srvman = new ServerManager())
{
workerProcesses = srvman.WorkerProcesses;
}
和
processes = Process.GetProcesses().Where(processItem => processItem.ProcessName.Contains("w3wp") || processItem.ProcessName.Contains("php-cgi"))
第一个 returns 运行 具有进程 ID 的应用程序池,第二个是从系统返回进程信息(所以这里是我获得 CPU 和内存使用情况的地方) .加入这两个信息给了我几乎我想要的。一个例外是 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
我打算汇总这些信息(在这种情况下,site.com 的内存使用量为 75 MB)。
您可以使用一点P/Invoke as described by Simon Mourier 来获取父进程的PID。这样做是一种低成本操作,并且会将所有 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 Worker DefaultAppPool:4396 using 61530112 total bytes php-cgi process 3540 using 7024640 bytes php-cgi process 3144 using 6389760 bytes