gpt4 book ai didi

javascript - Node 和错误 : EMFILE, 打开的文件太多

转载 作者:IT老高 更新时间:2023-10-28 13:19:50 25 4
gpt4 key购买 nike

几天来,我一直在寻找解决错误的有效解决方案

Error: EMFILE, too many open files

似乎很多人都有同样的问题。通常的答案涉及增加文件描述符的数量。所以,我试过这个:

sysctl -w kern.maxfiles=20480

默认值是10240。这在我看来有点奇怪,因为我在目录中处理的文件数在10240以下。更奇怪的是,我增加数字后仍然收到同样的错误文件描述符。

第二个问题:

经过多次搜索,我找到了解决“打开文件过多”问题的方法:

var requestBatches = {};
function batchingReadFile(filename, callback) {
// First check to see if there is already a batch
if (requestBatches.hasOwnProperty(filename)) {
requestBatches[filename].push(callback);
return;
}

// Otherwise start a new one and make a real request
var batch = requestBatches[filename] = [callback];
FS.readFile(filename, onRealRead);

// Flush out the batch on complete
function onRealRead() {
delete requestBatches[filename];
for (var i = 0, l = batch.length; i < l; i++) {
batch[i].apply(null, arguments);
}
}
}

function printFile(file){
console.log(file);
}

dir = "/Users/xaver/Downloads/xaver/xxx/xxx/"

var files = fs.readdirSync(dir);

for (i in files){
filename = dir + files[i];
console.log(filename);
batchingReadFile(filename, printFile);

不幸的是,我仍然收到同样的错误。这段代码有什么问题?

最佳答案

graceful-fs不起作用...或者您只是想了解泄漏的来源。遵循这个过程。

(例如,如果您的问题与套接字有关,graceful-fs 不会修复您的旅行车。)

来 self 的博客文章:http://www.blakerobertson.com/devlog/2014/1/11/how-to-determine-whats-causing-error-connect-emfile-nodejs.html

如何隔离

此命令将输出 nodejs 进程的打开句柄数:

lsof -i -n -P | grep nodejs
COMMAND     PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
...
nodejs 12211 root 1012u IPv4 151317015 0t0 TCP 10.101.42.209:40371->54.236.3.170:80 (ESTABLISHED)
nodejs 12211 root 1013u IPv4 151279902 0t0 TCP 10.101.42.209:43656->54.236.3.172:80 (ESTABLISHED)
nodejs 12211 root 1014u IPv4 151317016 0t0 TCP 10.101.42.209:34450->54.236.3.168:80 (ESTABLISHED)
nodejs 12211 root 1015u IPv4 151289728 0t0 TCP 10.101.42.209:52691->54.236.3.173:80 (ESTABLISHED)
nodejs 12211 root 1016u IPv4 151305607 0t0 TCP 10.101.42.209:47707->54.236.3.172:80 (ESTABLISHED)
nodejs 12211 root 1017u IPv4 151289730 0t0 TCP 10.101.42.209:45423->54.236.3.171:80 (ESTABLISHED)
nodejs 12211 root 1018u IPv4 151289731 0t0 TCP 10.101.42.209:36090->54.236.3.170:80 (ESTABLISHED)
nodejs 12211 root 1019u IPv4 151314874 0t0 TCP 10.101.42.209:49176->54.236.3.172:80 (ESTABLISHED)
nodejs 12211 root 1020u IPv4 151289768 0t0 TCP 10.101.42.209:45427->54.236.3.171:80 (ESTABLISHED)
nodejs 12211 root 1021u IPv4 151289769 0t0 TCP 10.101.42.209:36094->54.236.3.170:80 (ESTABLISHED)
nodejs 12211 root 1022u IPv4 151279903 0t0 TCP 10.101.42.209:43836->54.236.3.171:80 (ESTABLISHED)
nodejs 12211 root 1023u IPv4 151281403 0t0 TCP 10.101.42.209:43930->54.236.3.172:80 (ESTABLISHED)
....

注意:1023u(最后一行) - 这是第 1024 个文件句柄,默认最大值。

现在,看看最后一列。这表明哪个资源是打开的。您可能会看到许多行都具有相同的资源名称。希望现在可以告诉您在代码中查找泄漏的位置。

如果您不知道多个 Node 进程,请先查找哪个进程的 pid 为 12211。这会告诉您该进程。

在我上面的例子中,我注意到有一堆非常相似的 IP 地址。它们都是 54.236.3.### 通过进行 ip 地址查找,能够确定在我的情况下它与 pubnub 相关。

命令引用

使用此语法来确定一个进程打开了多少个打开的句柄...

获取某个 pid 的打开文件计数

我使用此命令测试在我的应用中执行各种事件后打开的文件数。

lsof -i -n -P | grep "8465" | wc -l
# lsof -i -n -P | grep "nodejs.*8465" | wc -l
28
# lsof -i -n -P | grep "nodejs.*8465" | wc -l
31
# lsof -i -n -P | grep "nodejs.*8465" | wc -l
34

你的进程限制是多少?

ulimit -a

你想要的线条看起来像这样:

open files                      (-n) 1024

永久更改限制:

  • 在 Ubuntu 14.04、nodejs v. 7.9 上测试

如果您希望打开许多连接(websockets 就是一个很好的例子),您可以永久增加限制:

  • 文件:/etc/pam.d/common-session (添加到末尾)

      session required pam_limits.so
  • 文件:/etc/security/limits.conf (添加到最后,如果已经存在则编辑)

      root soft  nofile 40000
    root hard nofile 100000
  • 重启你的 nodejs 并从 ssh 注销/登录。

  • 这可能不适用于较旧的 NodeJS,您需要重新启动服务器

  • 如果您的 Node 以不同的 uid 运行,则使用而不是。

关于javascript - Node 和错误 : EMFILE, 打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8965606/

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