内存泄漏会导致getaddrinfo EMFILE

时间:2016-01-22 17:00:22

标签: linux node.js ubuntu

我的NodeJS API遇到了一些问题。

有时候,它会返回ConnectionError: getaddrinfo EMFILE,并且在此之后都是fuc **。

所以,我开始调查了。我发现它会由“打开多个文件描述符”引起。我们显然可以增加已授权的打开文件的数量,但它不一定能解决问题。

我在this article中发现,我们可以增加文件描述符设置和ulimit。但有什么区别?

然后,为了尝试隔离我的问题,我运行了lsof -i -n -P | grep nodejs命令。实际上,建立的连接数量正在增加,所以我想我的代码中有一些未关闭的连接。

我有一些fs.readFileSyncfs.readDirSync等...但我没有设置autoClose:true。你觉得那会是吗?

您有任何想法或建议吗?

PS:应用程序在Ubuntu机器上运行

编辑,16-02-2016

我在生产机lsof -i -n -P | grep nodejs

上运行了此命令

我看到的是这样的:

...
nodejs    27596   root  631u  IPv4 109781565      0t0  TCP 127.0.0.1:45268->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  632u  IPv4 109782317      0t0  TCP 172.31.58.93:4242->172.31.55.229:61616 (ESTABLISHED)
nodejs    27596   root  633u  IPv4 109779882      0t0  TCP 127.0.0.1:45174->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  634u  IPv4 109779884      0t0  TCP 127.0.0.1:45175->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  635u  IPv4 109781569      0t0  TCP 127.0.0.1:45269->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  636u  IPv4 109781571      0t0  TCP 127.0.0.1:45270->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  637u  IPv4 109782319      0t0  TCP 127.0.0.1:45293->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  642u  IPv4 109781790      0t0  TCP 127.0.0.1:45283->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  643u  IPv4 109781794      0t0  TCP 127.0.0.1:45284->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  644u  IPv4 109781796      0t0  TCP 127.0.0.1:45285->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  645u  IPv4 109781798      0t0  TCP 172.31.58.93:4242->172.31.55.229:61602 (ESTABLISHED)
nodejs    27596   root  646u  IPv4 109781800      0t0  TCP 127.0.0.1:45286->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  647u  IPv4 109781802      0t0  TCP 172.31.58.93:4242->172.31.0.198:1527 (ESTABLISHED)
nodejs    27596   root  648u  IPv4 109781804      0t0  TCP 127.0.0.1:45287->127.0.0.1:7272 (ESTABLISHED)
nodejs    27596   root  649u  IPv4 109781806      0t0  TCP 127.0.0.1:45288->127.0.0.1:7272 (ESTABLISHED)

但我不知道这意味着什么,你有什么想法吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

所以我以为我发现了发生了什么!

我使用Redis&我的购物车存储的Redis会话npm模块,但是当我创建,更新时,我在使用之前每次都创建了与Redis的连接。

<body onresize="myFunction()">    
<script>
var width = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;

function myFunction() {
   if(width<500){
                   document.getElementById("yy").style.display="none";
   }else{
        document.getElementById("yy").style.display="absolute";
   }

}
</script>
<img id="yy src="..."/>

现在我刚刚在我的应用程序启动时创建了连接,并将其存储为单例并随时使用。

var session = new Sessions({ port : conf.redisPort, host : conf.redisHost});

session.get({
    app :    rsapp,
    token :  this.sessionToken },
    function(err, resp) {
        // here some workin'
    })

这很明显,但现在我找到了......如果它可以帮助某人,我会把这个标记为已解决。