我们正在使用FastCgi在iis上运行多个php站点。某些站点现在产生了许多以高cpu使用率运行的FastCgi实例。 不幸的是,所有的网站都是从networking服务运行的,我们没有看到什么W3WP过程产生了什么FastCgi处理。
有什么方法可以识别FastCgi并将其追踪到特定的AppPool或网站?
作为第一个评论,可以在Technet网站上findSysinternals Suite的Process Explorer。
http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx
只要花费足够的时间与这些工具。 select视图>显示句柄。 那么你会看到下面的面板显示了当前iis服务使用的所有IPC&打开的文件和端口。 此外,通过IPC提供的程序化解决scheme的套件版本中也提供了命令行工具。 所有的工具都以Ps *开头,可以为您提供更多的信息。
对于Linux人员来说:Process Explorer是具有lsoffunction的stream程列表工具。
我其实认为这是使用apache和mod_php而不是fastcgi的最好的参数之一。 当你遇到性能危机时,这一点非常重要。 我偶尔会考虑一下,在php_fpm中实现这个function需要什么,但是还没有find时间。
不幸的是我的答案是基于Linux的,这可能对你没有帮助(因为你参考IIS)。 无论如何,我会把答案,也许有窗口等效于我提到的工具)
你可以设置一些特别的function,在你的php处理开始处logging接收到的URL,PHP进程的进程ID,以及可能的其他一些细节,比如计时。 您还可以logging处理完成情况,如果您不能依赖所有PHP请求的日志logging,那么这一点尤其重要。
我还没有find一个好的方法来将该URL和堆栈的前端连接到PHP进程,但是通过跟踪lsof中的套接字ID,我已经从Postgresql进程成功跟踪回到PHP进程。 每个postgresql会话都由一个单独的进程处理,使得这更容易。 我不知道如何为mysql做同样的事情,但是我也没有付出太多的努力。 除了跟踪套接字ID之外,还可以通过在数据包数据中查找查询,然后查看哪些进程保存与您感兴趣的stream量关联的端口ID,从而取得进展。
另一种方法(我在linux上知道的最有用的方法)是查看正在使用所有CPU的php进程内正在发生的事情。 你的主要工具是strace和ltrace。 请注意,这样做会增加额外的cpu和IO负载,但是您可以附加一个进程来logging与您感兴趣的进程相关的系统调用(strace)或库函数调用(ltrace)。它并不总是因为你可以让一个进程陷入一个没有向系统或其他库发出呼吁的紧密循环,但是更多的时候这会让你得到你所需要的东西。
我还没有真正进入这个领域,但是我认为如果你使用php-dev来附加gdb到你的进程会停下来,你也可以看看堆栈。 你会得到一个C语言堆栈,而不是一个PHP堆栈,但是大概你可以在那里findphp函数的名字,并且找出涉及到哪些函数。 正如我所说的,你必须暂停执行,但是如果你编写了一些附加gdb的代码,打印出一个栈列表并断开连接,你不必中断任何事情。 我怀疑有一些Windows程序员使用C ++,C ++和C#等语言可以做到这一点的debugging工具?
这将是值得一看,你可以从各种PHPdebugging器得到什么。
所以这并不完全是你所要求的,但也许你现在有一些关于其他方法的想法来解决你在活动过程中发生的事情的问题。
也许别人可以指出一些相当于我使用的Linux工具的窗口?