gpt4 book ai didi

node.js - fs.writeFile 在高负载时挂起(v.0.6.6 上没有错误)

转载 作者:太空宇宙 更新时间:2023-11-04 01:15:55 24 4
gpt4 key购买 nike

我们正在尝试服务尽可能多的请求,并为每个请求写入一个文件。小负载工作正常,但在高负载情况下,虽然同步版本仍然工作正常,但异步版本 (fs.writeFile) 会挂起。 Node 停止服务请求并将大多数文件保留为 0 大小(其中大多数都没有创建)。

v0.6.6没有错误

在 v.0.4.7 中我们得到了:

{ stack: [Getter/Setter],
arguments: undefined,
type: undefined,
message: 'EMFILE, Too many open files \'aw_1031\'',
errno: 24,
code: 'EMFILE',
path: 'aw_1031' }

Ubuntu(VM) 和 Mac Osx 中的行为相同。

这是我们当前正在运行的示例脚本:

ab -n 30000 -c 500 http://HOST:8000/

文件测试.js

var http = require('http');
var fs = require('fs');
var util = require ('util');
var i=0;

function writeALot(req, res){
fs.writeFile("filetest"+i, "Just a try: "+i,
function(err){
if(err) console.log(util.inspect(err));
});
i++;
res.writeHead(200);
res.end();
}
http.createServer(writeALot).listen(8000);

我们如何管理并发 fd 的最大数量?有什么建议吗?

提前致谢。

最佳答案

文件描述符的数量是有限的(http 连接也是文件描述符)。这里,每个连接都会写入一个文件,在 500 个并发情况下将有 1000 个文件描述符。可能您的 ulimit -n 是 1024。您实际上可以增加限制,我见过人们在生产高并发服务器上这样做。除此之外,您还可以创建一个并发数小于 500 的队列。我在我的一个应用程序中使用 async 执行此操作。模块。对我提出的每个请求设置上限。这将保存我正在创建的文件描述符,但不保存传入的连接。

var queue = async.queue(function(task, cb) {
console.log('processing', task.method, queue.length(), task.addr)
if(task.method === 'file') {
makeFileStream(task);
} else {
makeRequest(task);
}
}, 500);

然后,如果我想发出请求或打开文件,

queue.push({
method : 'file', // or request
task : 'something'
});

还有这样的方式:http://nodebits.org/distilled-patterns

但是批处理的示例并不像使用队列那样好。

关于node.js - fs.writeFile 在高负载时挂起(v.0.6.6 上没有错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8850605/

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