Linux C++程序解决文件句柄(包括socket句柄等)耗尽问题
来源:互联网 发布:中国港湾待遇 知乎 编辑:程序博客网 时间:2024/05/16 08:51
最近在线上发现一个问题,程序在服务器上跑了3周后,会出现新日志文件创建不出来的问题,另外,该程序需要使用curl访问后端的HTTP服务调用总是失败。日志文件创建不出来由于不是关键业务,一开始没有做太多关注。但是访问后端HTTP服务失败的问题却是很要命。监控报警一响,我们首先尝试解决问题,就重启了所有程序,问题解决。之后,就立马排查这个问题发生的原因。
在没有重启程序前,首先怀疑的自然是后端HTTP服务有问题(虽然该服务的报警没有响起),一个同事在服务器上命令行尝试curl调用,没有问题(这也排除了DNS问题、防火墙问题,无需再ping和telnet了)。
查询出现问题时服务器使用的CPU、内存量和磁盘剩余空间,都是正常的。
我突然将新日志文件创建不出来的问题和curl调用后端HTTP服务失败的问题联系起来,这两者都需要创建文件句柄(curl需要创建socket句柄),会不会是文件句柄耗尽的问题呢?
测试环境大压力压程序,命令行使用“lsof -c 程序名 | wc -l”,确实发现打开的文件句柄越来越多。问题找到了。接下来就发现是一个函数内socket句柄创建后没有关闭。添加close(fd)后,再次在测试环境测试,打开的文件句柄数量没有出现增长,问题解决。
由于程序中加了设置可以打开文件句柄最大数量为65535,所以,这个问题事前根本没有想到,而且在系统频繁发布(一周两次发布)的情况,根本不会出现。但是当发布频率放缓后,问题就出现了。
因此,Linux程序开发,除了需要关注CPU使用率、内存使用率和硬盘空间外,也需要特别关注一下程序打开的文件句柄释放的问题。
PS:更新打开文件句柄的最大数量程序如下:
#include <sys/time.h>#include <sys/resource.h>void max_fd(){struct rlimit rlim, rlim_new;if (getrlimit(RLIMIT_NOFILE, &rlim) == 0) {printf("RLIMIT_NOFILE Old Soft(%d), Hard(%d)\n", rlim.rlim_cur, rlim.rlim_max);if(rlim.rlim_max < 65535 && rlim.rlim_max != RLIM_INFINITY){rlim_new.rlim_max = 65535;}if(rlim.rlim_cur < 65535 && rlim.rlim_max != RLIM_INFINITY){rlim_new.rlim_cur = 65535;}if (setrlimit(RLIMIT_NOFILE, &rlim_new) != 0) {rlim_new.rlim_cur = rlim_new.rlim_max = rlim.rlim_max;(void) setrlimit(RLIMIT_NOFILE, &rlim_new);printf("RLIMIT_NOFILE New Soft(%d), Hard(%d)\n", rlim_new.rlim_cur, rlim_new.rlim_max);}else{printf("RLIMIT_NOFILE New Soft(%d), Hard(%d)\n", rlim_new.rlim_cur, rlim_new.rlim_max);}}}
- Linux C++程序解决文件句柄(包括socket句柄等)耗尽问题
- Linux C++程序解决文件句柄(包括socket句柄等)耗尽问题
- tomcat环境下服务器文件句柄耗尽(Too Many Open Files)的问题排查
- tomcat环境下服务器文件句柄耗尽(Too Many Open Files)的问题排查
- tomcat环境下服务器文件句柄耗尽(Too Many Open Files)的问题排查
- tomcat环境下服务器文件句柄耗尽(Too Many Open Files)的问题排查
- Linux系统的文件句柄数量问题
- Linux系统的文件句柄数量问题
- Linux系统的文件句柄数量问题
- Linux文件句柄
- Linux文件句柄泄露
- Linux文件句柄
- linux查看文件句柄
- linux文件句柄
- Linux:扩大文件句柄
- linux 进程 文件句柄
- linux句柄问题
- linux句柄泄露问题
- (WIN32和Kernel)直接读写硬盘扇区
- MySQL 5.5 新增SIGNAL异常处理
- Reddit联合创始人教你避免软件开发中的错误
- 运用Ant编译Java程序的一个小实例
- Boost-Boost库的编译
- Linux C++程序解决文件句柄(包括socket句柄等)耗尽问题
- 非完美C++ Singleton实现
- 解决 线程间操作无效: 从不是创建控件的线程访问它
- yacc / lex 在linux 下 使用指南
- MongoDB as windows service
- CMS中常用的php函数
- 市场静待美联储利率决议,汇市趋于震荡
- 如何重写的 MFC 控件容器接口方法,在 Visual c + + 中的几个默认行为
- 普通人的编辑利器——VIM