我们在 Apache 2.2 mysql5.5 上运行 Drupal 6.26、PHP 5.3。Prod Web 服务器有负载均衡器,与两个 PROD 应用服务器一起运行。Prod Web 服务器出现故障,httpd.exe 占用了 100% 的 CPU。
以下是崩溃转储的摘录。这是 Apache 挂起的线程。
. 0 Id: 126c.c20 Suspend: 0 Teb: 7efdd000 Unfrozen
ChildEBP RetAddr
000cfd60 765615e9 ntdll!ZwWaitForMultipleObjects+0x15
000cfdfc 762319fc KERNELBASE!WaitForMultipleObjectsEx+0x100
000cfe44 762341d8 kernel32!WaitForMultipleObjectsExImplementation+0xe0
000cfe60 6ff1dc10 kernel32!WaitForMultipleObjects+0x18
WARNING: Stack unwind information not available. Following frames may be wrong.
000cfe9c 6ff20655 libhttpd!ap_regkey_value_remove+0x710
000cfec4 004017c7 libhttpd!ap_mpm_run+0x1c5
000cff14 00401f73 httpd+0x17c7
000cff88 7623336a httpd+0x1f73
000cff94 776a9f72 kernel32!BaseThreadInitThunk+0xe
000cffd4 776a9f45 ntdll!__RtlUserThreadStart+0x70
000cffec 00000000 ntdll!_RtlUserThreadStart+0x1b
答案1
这看起来确实像是锁定(即互斥意义上的锁定)代码,但很难真正确定。正如警告所述,确保获取正确信息的唯一方法是在发生故障时让 Apache 在调试器下运行。同样的方法还将确保您能够提取有关系统状态的其他相关信息。
当然,实际的解决方案可能是简单地把一些猴子扔到打字机上,看看你是否能从中摆脱问题没有不得不求助于像在 Windows 上跟踪调试 Apache 这样痛苦的事情。例如,您可以尝试不同的 WAMP 堆栈发行版,或者在服务器上切换操作系统(如果可行)。归根结底,这是一个非常棘手的问题,因此两种途径——找到并解决问题,或绕过它——都值得充分考虑。
值得一提的是,在 Linux 上,我发现这些问题最常出现在 opcache 缓存、优化器和 (反) 混淆器周围。如果您正在运行此类代码(例如 IonCube、ZendGuard、APC、适用于 PHP 的 Windows 缓存扩展等),请考虑将其关闭一两个小时,看看问题是否消失。