admin管理员组

文章数量:1654428

前几天服务器上出现程序cpu标高,通过gdb看堆栈信息,发现Too many open files问题

 

通过lsof -p pid |wc -l看到文件非常高

分析如下:

程序主要是通过360开源的evpp 调用libevent 的http接口实现简单http服务器功能。所以一开始就就直接怀疑是evpp开源代码出现的问题,然后就看源代码分析。看句柄释放位置,但是不得而终。

后面开始用strace工具分析代码调用堆栈。

1、直接前端运行代码:

strace -f -F -o dcop-strace.txt dcopserver

这里 -f -F选项告诉strace同时跟踪fork和vfork出来的进程,-o选项把所有strace输出写到dcop-strace.txt里 面,dcopserver是要启动和调试的程序。

2、运行测试用例

3、关闭程序看dcop-strace.txt文件

   

显然开源代码已经在http返回时候执行了关闭操作。

4、重新1-2步操作,看进程id 在看/proc/pid/fd/里面的文件句柄,

5、执行测试用例,看多出的fd是哪些

 

 

6、再看dcop-strace.txt文件发现问题,通过文件内容里面显示的上下文调用顺序就可以很容易定位到问题

 

本文标签: 句柄lsofidentifyprotocol