进程使用的文件描述符fd值达到最大值引起的问题

1、问题描述

近日,在测试一个设备的SDK网关,当时我在测试断网情况下,sdk采集的数据是否能正常将数据保存到本地sqlite数据库,开始的时候程序一切正常按照预期的将采集数据存储到本地,如果断网时间不长又将网络连接上,那么sdk能正常的重连主网关也业务网关将存储在本地sqlite数据库的数据上传到云端,当断网时间达到1小时20分钟左右,sdk正常采集数据,但数据却无法被存储到本地sqlite数据库,如果此时将网络恢复正常,程序尝试调用系统函数getaddrinfo通过主网关域名获取域名对应的ip将会一直返回失败,实在不解啊。

 

2、原因阐述

由于系统进程能打开的文件描述的的最大值为默认为1024(可通过命令查看特定进程当前打开的最大描述符值: watch "ls /proc/`pidof entryMain`/fd | wc -l"),当前进程使用的文件描述符最大值已达到1024,那么后续所有的包括系统函数open,socket等调用都将返回失败,因为当前并没有可用的文件描述符,但是进程的文件描述符达到最大值为啥会能够引发上述问题,我到现在还不知其中的缘由,这应该是内核层的东西,本人不太熟悉内核,待研究。

 

3、修复问题

当时还不知是因为系统文件描述使用完了才导致问题1的发生,但是我能够确认是sdk程序出现了fd不关闭泄漏问题,然后就顺着这个问题将问题修复了,然后再进行测试,果然过了一个多小时,甚至好几个小时后,进程当前打开的描述符的值保持不变,问题1也同时得到了修复,但是fd值达到最大值为啥能够引发这样的问题,待继续探究。

posted @ 2019-01-24 16:50  hgrical_小农  阅读(685)  评论(0编辑  收藏  举报