我们在这种情况下:https ://stackoverflow.com/questions/7304826/how-to-debug-a-multithreaded-hung-process-in-linux
当我们尝试查看一个流氓进程(消耗 100% CPU)时,它处于以下状态:
ls -l /proc/XXXX/fd
lrwx------ 1 root root 64 Feb 1 16:08 9 -> /tmp/.ZendSem.sdiU42 (deleted)
我们想知道文件中的内容(现在已被删除),以尝试追踪导致问题的原因。我认为 ftrace 可能能够做到这一点(或者可能是另一个工具),但我不知道如何去做。
/tmp/.ZendSem.sdiU42
是一个锁定文件,在创建后立即被有意删除。这足以防止这个锁被其他线程取出。它还具有一旦进程消失就消失的好特性。查看 php 源代码,ext/opcache/zend_shared_alloc.c您需要收集更多关于您的应用程序正在做什么以及它如何与软件堆栈和内核交互的上下文。
识别 Web 服务器日志中的 PID 并查看您是否可以识别任何内容,可能是在工作人员被分叉时。
分析执行。在 Linux 上,运行
perf top
并查看最耗时的位置。为这个程序和内核安装调试符号,直到你能理解函数名。ltrace
另外,如果您想要类似strace
但用于用户库调用的东西,请尝试。