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