我刚开始玩 Web 开发,node.js + express 帮助我在我不那么强大的嵌入式系统上快速建立了一个简单的服务器。但是,当尝试将 270MB 目录作为 tarfile 提供时,我的解决方案的性能一点也不好。
在获得有关 irc 的帮助后,我尝试使用 fstream 和 node-tar 提供文件,如下所示:
fstream.Reader({ type: "Directory" , path: mydir }).pipe(tar.Pack({})).on("error", function(){ res.statusCode = 500; res.end('Unable to create tarball'); }).pipe(res)
它可以工作,但是将 270MB 的文件下载到我的 PC 需要大约 20 分钟。作为一个实验,我尝试在目标上压缩文件夹,然后将其 scp'ed 到我的 PC 上。这花了 1 分 12 秒 + 2 分 17 秒,这有很大的不同。
(我尝试使用 node-static 提供预压缩文件,但我的嵌入式系统内存不足)
知道是什么让 express+node.js 解决方案如此缓慢吗?
更新一些基准测试:
我怀疑使用另一个网络服务器对于静态文件服务会更好,但我认为它不能解释这里的巨大差异。
对文件夹进行基准测试,生成 64MB tar
手动:
46 秒
# on server:
tar -cf foo.rar <folder>
# on client
scp root@<ip>/path/to/foo.rar .
fstream + node-tar:直接
4 分 25 秒
fstream.Reader({type: "Directory", path: dir}).pipe(tar.Pack({})).on("error", function(){res.statusCode = 500; res.end('Unable to create tarball');}).pipe(res);
fstream + node.tar:首先流式传输到文件,然后提供文件
1 分 11 秒
fstream.Reader({type: "Directory", path: dir}).pipe(tar.Pack({})).on("error", function(){res.statusCode = 500; res.end('Unable to create tarball');}).pipe(fstream.Writer('/tmp/test.rar').on("close", function() {
var rs = fs.createReadStream('/tmp/test.rar');
rs.on('data', function(data) {
res.write(data);
});
rs.on('end', function() {
res.end();
});
}));