gpt4 book ai didi

linux - 内存泄漏会导致getaddrinfo EMFILE

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:39 29 4
gpt4 key购买 nike

我在使用 NodeJS API 时遇到了一些问题。

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

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

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

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

我有一些 fs.readFileSyncfs.readDirSync 等等……但我还没有设置 autoClose:true。你以为会是这样吗?

您有什么想法或建议吗?

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


编辑,2016 年 2 月 16 日

我已经在我的生产机器上运行了这个命令 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)

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

非常感谢。

最佳答案

所以我想我知道发生了什么事了!

我将 Redis 和 Redis session npm 模块用于我的购物车存储,但是当我创建、更新时,我每次都在使用它之前创建了一个到 Redis 的连接。

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

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

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

// At the start of the App
var NS = {
sessions : new RedisSessions({port: config.redisPort, host: config.redisHost}),
};

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

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

关于linux - 内存泄漏会导致getaddrinfo EMFILE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34952121/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com