上下文:我正在开发一台基于Java的网络服务器,该服务器意外地泄漏管道。每隔几天,它就会达到40,000个文件描述符和死亡的极限。在死前在服务器上使用lsof显示它被管道堵塞了。管道连接到自己,而不是另一个过程。
代码库中没有一部分创建或使用管道--我们可以看到。
一些较旧版本的JVM在创建套接字时已经创建了一个管道&泄漏了一个管道,但是这在java 1.7.0_75上展示了,我认为它不会受到这个错误的影响。
,我的问题是:使用现代的Linux (例如perf),当进程调用pipe(2)系统调用时,是否有可能对其进行快照--我认为这是创建管道的唯一方式。此外,还可能从其中检索Java堆栈跟踪吗?
考虑到这些信息,应该可以回答“谁在制造管道,为什么?”这个问题。
发布于 2016-07-08 12:38:43
在java 1.7.0_75 (或java 8更新60前)上,您只能从事件调用堆栈上的perf获取有限的信息,因为堆栈将被截断(见下文)。
您可以在sys调用管道时获得系统范围的跟踪点事件,并使用下面的perf命令或类似的命令关闭事件。
perf record -e 'syscalls:sys_enter_pipe*' -e 'syscalls:sys_enter_close' -ag -- sleep 10要获得完整的堆栈:
截断的堆栈将是在底部没有线程启动函数的堆栈,例如:
java 19575 [018] 10600910.346655: syscalls:sys_enter_pipe: fildes: 0x7f353b9f7f80
7f3809cff0b7 __pipe (/usr/lib64/libc-2.17.so)
7f37f59aecb9 [unknown] (/tmp/perf-19375.map)
7f37f5e83150 [unknown] (/tmp/perf-19375.map)
edb4639ef8034082 [unknown] ([unknown])完整的堆栈看起来可能更像:
java 21553 [009] 10601254.522385: syscalls:sys_enter_pipe: fildes: 0x7f545322f340
7f54527180b7 __pipe (/usr/lib64/libc-2.17.so)
7f543d007760 [unknown] (/tmp/perf-21552.map)
7f543d0007a7 [unknown] (/tmp/perf-21552.map)
7f5451ce1be6 JavaCalls::call_helper (/usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so)
7f5451fe7b27 Reflection::invoke (/usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so)
7f5451feb237 Reflection::invoke_method (/usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so)
7f5451d705fb JVM_InvokeMethod (/usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so)
7f543da669ed [unknown] (/tmp/perf-21552.map)
7f543d0007a7 [unknown] (/tmp/perf-21552.map)
7f5451ce1be6 JavaCalls::call_helper (/usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so)
7f5451d23182 jni_invoke_static (/usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so)
7f5451d3fb8a jni_CallStaticVoidMethod (/usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so)
7f5452bfcbcc JavaMain (/usr/java/jdk1.8.0_60/jre/lib/amd64/jli/libjli.so)
7f5452e12df5 start_thread (/usr/lib64/libpthread-2.17.so)与perf代理一起运行,允许perf将JITted未知函数解析为java方法。
还有关于如何做到这一点的各种其他指南,包括Brendan的工作http://techblog.netflix.com/2015/07/java-in-flames.html
https://stackoverflow.com/questions/38264181
复制相似问题