Node.js 不关闭由 fs.createReadStream() 创建的文件
Node.js not closing files created by fs.createReadStream()
在我的服务器上,每次用户使用我们的服务时,我们都必须从服务器上为他们抓取一个 JSON 文件。我通过在我自己的函数中使用 fs.createReadStream()
来做到这一点。
function getJSONFromServer(filepath, callback){
var data = fs.createReadStream(filepath);
data.on('error', function (error) {
console.log("Caught", error);
callback(undefined, error);
});
var jsonFile = "";
data.on('data', function(chunk) {
jsonFile += chunk;
});
data.on('end', function() {
var jsonData = JSON.parse(jsonFile);
callback(jsonData);
data.destroy();
data.close();
});
}
这会完成工作,但不会关闭与文件的连接。因此在读取 1024 个文件(我的服务器的限制)后,Node.js 将产生错误 EMFILE, too many open files
。然后我必须关闭我们的 Node.js 服务器,再次打开它,这将清除 "open files".
我检查 lsof -i -n -P | grep nodejs
打开的文件数量。它显示如下内容:
nodejs 13707 node 10u IPv4 1163695 0t0 TCP 127.0.0.1:55643->127.0.0.1:27017 (ESTABLISHED)
nodejs 13707 node 11u IPv4 1163697 0t0 TCP 127.0.0.1:55644->127.0.0.1:27017 (ESTABLISHED)
打开的文件数量。
我试过使用 graceful-fs。我试过调用 stream.destroy()
和 stream.close()
,但我仍然遇到同样的问题。我的服务器本质上是一个定时炸弹,因为我们有大量稳定的用户流量,在这么多用户连接后它就会停止工作。
此外,ulimit -n [open file amount]
不起作用,即使它起作用,这也不是一个长期的解决方案,因为我希望我的文件连接关闭而不是无缘无故地打开。
我正在使用 Node.js 版本 v0.10.25
、Ubuntu 15.04 (GNU/Linux 3.19.0-42-generic x86_64)
和最新版本的 graceful-fs
如果有帮助!
感谢您提供的任何帮助。
这一定是我犯过的最愚蠢的错误。无论如何,答案在这里。我希望我可以避免有人处理这个错误并且几乎把他们的头发扯掉。
我是 运行 我的应用 nodejs
而不是 node
。事实证明,如果你这样做 nodejs --version
,它可能 return 一个非常旧的版本,对我来说是 v0.10.25
。 node --version
然而是 v5.6.0
。显然,版本的大幅提升会解决一些问题,所以我 运行 使用 node app.js
而不是 nodejs app.js
的应用程序,从那以后我就再也没有遇到过这个问题。现在只有 6 个打开的文件,而之前我们有 1000 多个打开的文件。
该死的,说出这件事感觉真好。
在我的服务器上,每次用户使用我们的服务时,我们都必须从服务器上为他们抓取一个 JSON 文件。我通过在我自己的函数中使用 fs.createReadStream()
来做到这一点。
function getJSONFromServer(filepath, callback){
var data = fs.createReadStream(filepath);
data.on('error', function (error) {
console.log("Caught", error);
callback(undefined, error);
});
var jsonFile = "";
data.on('data', function(chunk) {
jsonFile += chunk;
});
data.on('end', function() {
var jsonData = JSON.parse(jsonFile);
callback(jsonData);
data.destroy();
data.close();
});
}
这会完成工作,但不会关闭与文件的连接。因此在读取 1024 个文件(我的服务器的限制)后,Node.js 将产生错误 EMFILE, too many open files
。然后我必须关闭我们的 Node.js 服务器,再次打开它,这将清除 "open files".
我检查 lsof -i -n -P | grep nodejs
打开的文件数量。它显示如下内容:
nodejs 13707 node 10u IPv4 1163695 0t0 TCP 127.0.0.1:55643->127.0.0.1:27017 (ESTABLISHED)
nodejs 13707 node 11u IPv4 1163697 0t0 TCP 127.0.0.1:55644->127.0.0.1:27017 (ESTABLISHED)
打开的文件数量。
我试过使用 graceful-fs。我试过调用 stream.destroy()
和 stream.close()
,但我仍然遇到同样的问题。我的服务器本质上是一个定时炸弹,因为我们有大量稳定的用户流量,在这么多用户连接后它就会停止工作。
此外,ulimit -n [open file amount]
不起作用,即使它起作用,这也不是一个长期的解决方案,因为我希望我的文件连接关闭而不是无缘无故地打开。
我正在使用 Node.js 版本 v0.10.25
、Ubuntu 15.04 (GNU/Linux 3.19.0-42-generic x86_64)
和最新版本的 graceful-fs
如果有帮助!
感谢您提供的任何帮助。
这一定是我犯过的最愚蠢的错误。无论如何,答案在这里。我希望我可以避免有人处理这个错误并且几乎把他们的头发扯掉。
我是 运行 我的应用 nodejs
而不是 node
。事实证明,如果你这样做 nodejs --version
,它可能 return 一个非常旧的版本,对我来说是 v0.10.25
。 node --version
然而是 v5.6.0
。显然,版本的大幅提升会解决一些问题,所以我 运行 使用 node app.js
而不是 nodejs app.js
的应用程序,从那以后我就再也没有遇到过这个问题。现在只有 6 个打开的文件,而之前我们有 1000 多个打开的文件。
该死的,说出这件事感觉真好。