我们处于这种情况: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 可能能够做到这一点(或者可能是其他工具),但我不知道如何去做。
答案1
/tmp/.ZendSem.sdiU42
是一个在创建后立即被故意删除的锁定文件。这足以防止此锁定被其他线程取走。它还具有在进程消失后消失的良好特性。请参阅 php 源代码 ext/opcache/zend_shared_alloc.c
您需要收集更多有关应用程序正在做什么以及它如何与软件堆栈和内核交互的背景信息。
在 Web 服务器日志中识别 PID,看看是否可以识别任何内容,也许是当工作程序被分叉时。
分析执行情况。在 Linux 上,运行perf top
并查看它在哪里耗时最多。为此程序和内核安装调试符号,直到您能理解函数名称。此外,ltrace
如果您想要类似strace
但针对用户库调用的操作,请尝试。