记一次服务程序调试过程(linux进程打开文件句柄过多问题)

发布时间 2023-06-22 17:58:43作者: strongbug1

最近在测试服务程序,对外提供HTTP服务(使用c++调用libevent实现,回调使用curl库)。

开始测试几百个请求时,功能一直挺正常。但是加大请求数量后(请求量大于5000),出现很奇怪的现场,每次接收的响应大约在3400个左右时,服务程序不再返回响应。

开始怀疑是http服务异常了,使用http工具单独再发请求时,能正常收到200的响应(但是服务程序的日志文件不再更新。。。)。

所以就不在起后台进程,直接在终端中启动程序,观察日志屏幕输出,发现有请求时,屏幕输出是正常的。不过测试过程中偶然发现终端输出了“accept call too many open files”错误。

经查询发现是程序打开的文件句柄过多导致的。随使用命令确认:

lsof -p pid | wc -l

查询进程打开的文件句柄数量,得到结果是1091(大于了1024的系统限制值),然后查询进程打开的文件句柄信息:

lsof -p pid > openfiles.log

这个文件中可以查询进程打开的文件句柄对应的文件信息,经过此步,定位到程序中有一处存文件时没有关闭文件句柄的错误。修改后,再测试,该问题解决,特此记录一下。

感谢链接:

https://blog.csdn.net/pyf09/article/details/112244551