用简单的Web服务器在nodejs中挂起文件描述符

我有一个非常有趣的问题,我似乎无法解决。 它实际上可能不是一个问题,而是内置在node.js中的东西。 在发送响应之后,我遇到了文件描述符长于预期的问题。 在发送任何数据后,他们似乎坚持ESTABLISHED状态长达2分钟。 这是我们的生产服务器造成的问题。 即使我们正在提供静态文件,一次可打开的文件描述符的数量可能非常高。 他们经常遇到我们的系统限制(linux)并导致EMFILE问题。 我意识到我们可以修改1024以上的硬限制,但是这似乎是一个不同的问题的解决方法。 一旦套接字closures,就会在我看来,文件描述符应该被释放。

我有node.js版本:0.10.24

我已经能够用less量的代码复制这个问题。

http服务器:

var http = require("http"), url = require("url"), path = require("path"), fs = require("fs") port = process.argv[2] || 8888; http.createServer(function(request, response) { var uri = url.parse(request.url).pathname , filename = path.join(process.cwd(), uri); var contentTypesByExtension = { '.html': "text/html", '.css': "text/css", '.js': "text/javascript" }; path.exists(filename, function(exists) { fs.readFile(filename, "binary", function(err, file) { if(err) { response.writeHead(500, {"Content-Type": "text/plain"}); response.write(err + "\n"); response.end(); return; } var headers = {}; var contentType = contentTypesByExtension[path.extname(filename)]; if (contentType) headers["Content-Type"] = contentType; response.writeHead(200, headers); response.write(file, "binary"); response.end(); }); }); }).listen(parseInt(port, 10)); console.log("Static file server running..."); ``` 

向服务器发出请求。 我做了一个简单的请求一个静态js文件。 在发出请求之前和之后监视文件描述符。

 $ lsof -i -n -P | grep node 

我的结果:

启动服务器之后,请求之前:

node 16787 ncswenson 11u IPv4 0x884c32306a467c65 0t0 TCP *:8888 (LISTEN)

请求完成后(请求后最多2分钟):

node 16787 ncswenson 11u IPv4 0x884c32306a467c65 0t0 TCP *:8888 (LISTEN) node 16787 ncswenson 12u IPv4 0x884c32306a2773b5 0t0 TCP 127.0.0.1:8888->127.0.0.1:49399 (ESTABLISHED)

这是节点应该如何正确performance? 在请求之后让文件描述符保持打开几分钟? 有没有办法来解决这个问题? 有没有办法更好地调查这个问题?