Linux C++程序解决文件句柄(包括socket句柄等)耗尽问题

线上程序运行三周后出现日志文件创建失败及curl HTTP调用错误,经排查发现是文件句柄耗尽导致。通过测试发现某函数内的socket句柄未关闭,增加close()后问题解决。提醒开发者关注Linux程序中文件句柄的释放,特别是发布频率放缓时。更新最大打开文件句柄数的方法也一并提及。
摘要由CSDN通过智能技术生成

最近在线上发现一个问题,程序在服务器上跑了3周后,会出现新日志文件创建不出来的问题,另外,该程序需要使用curl访问后端的HTTP服务调用总是失败。日志文件创建不出来由于不是关键业务,一开始没有做太多关注。但是访问后端HTTP服务失败的问题却是很要命。监控报警一响,我们首先尝试解决问题,就重启了所有程序,问题解决。之后,就立马排查这个问题发生的原因。

在没有重启程序前,首先怀疑的自然是后端HTTP服务有问题(虽然该服务的报警没有响起),一个同事在服务器上命令行尝试curl调用,没有问题(这也排除了DNS问题、防火墙问题,无需再ping和telnet了)。

查询出现问题时服务器使用的CPU、内存量和磁盘剩余空间,都是正常的。

我突然将新日志文件创建不出来的问题和curl调用后端HTTP服务失败的问题联系起来,这两者都需要创建文件句柄(curl需要创建socket句柄),会不会是文件句柄耗尽的问题呢?

测试环境大压力压程序,命令行使用“lsof -c 程序名 | wc -l”,确实发现打开的文件句柄越来越多。问题找到了。接下来就发现是一个函数内socket句柄创建后没有关闭。添加close(fd)后,再次在测试环境测试,打开的文件句柄数量没有出现增长,问题解决。

由于程序中加了设置可以打开文件句柄最大数量为65535,所以,这个问题事前根本没有想到,而且在系统频繁发布(一周两次发布)的情况,根本不会出现。但是当发布频率放缓后,问题就出现了。

因此,Linux程序开发,除了需要关注CPU使用率、内存使用率和硬盘空间外,也需要特别关注一下程序打开的文件

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值