NodeJS 上传文件 100% cpu 使用率
Posted
技术标签:
【中文标题】NodeJS 上传文件 100% cpu 使用率【英文标题】:NodeJS upload files 100% cpu usage 【发布时间】:2015-04-05 02:56:55 【问题描述】:我尝试了两个不同的库:multer 和 formidable 用于处理节点中的文件上传,并且它们在上传期间都使用 100% 的 CPU。
是常见的节点问题吗?以及在高并发环境下人们是如何处理的?
节点版本:v0.10.36
(我什至尝试过其他版本,例如 v0.11.x 或 v0.10.33)
强大的例子
Picture.upload = function(user, req, cb)
var formidable = require('formidable')
var form = new formidable.IncomingForm();
form.uploadDir = "./uploads";
form.maxFieldsSize = app.settings.uploadMaxSize * 1024 * 1024;
form.maxFields = 1000;
form.parse(req, function(err, fields, files)
cb(null, files);
);
Multer 示例
app.use(multer( dest: './uploads/',
rename: function (fieldname, filename)
return filename+Date.now();
,
limits:
files: 1,
fileSize: app.settings.uploadMaxSize * 1024 * 1024
)); // after I process the file from req.files
文件上传为multipart/form-data
。
我正在使用loopback,但我认为它没有任何区别。
【问题讨论】:
你能发布一个代码示例吗?只是一个疯狂的猜测,也许这与github.com/felixge/node-formidable/issues/109有关? 我不认为这是相关的,因为我的问题是 CPU 而不是内存使用。无论如何,我添加了两个代码 sn-ps 你确定使用 100% 的 CPU 确实值得担心吗?例如,如果这是在您的测试机器上,而您的测试机器没有做任何其他事情,这可能就是应该发生的事情。一个更好的问题可能是:这会阻塞事件循环吗?你测试了吗? 请提供文件上传后发生的任何处理的详细信息,并可能在没有此后处理的情况下分析 CPU 负载。如果您已经这样做了,那么可能还值得进行基准测试,看看您是否真的有显着的性能损失。想到的其他事情是,由于管理程序限制,您可能会遇到问题。您是在虚拟机还是裸机中运行它?什么操作系统(和内核版本)。如果您使用的是 linux,您可以通过 mpstat 提供统计信息吗? 我刚刚在一个测试应用程序中测试了一个非常简单的文件上传,一个 11M 的电影似乎使 Amazon EC2 t2.micro 实例上的 CPU 从大约 3% 移动到大约 10%。不太科学或统计意义不大,但可能表明它可能值得像@tsturzi 建议的那样进行更多分析?我使用的是 express 和 Multer,但没有使用环回。此外,正如其他人所认为的那样,我认为建议的 CPU 使用需要仔细解释,因为大多数操作系统会管理负载以充分利用可用的 CPU(例如,当没有太多事情发生时,可能会运行低优先级的内务管理任务)。 【参考方案1】:在高并发环境中,如果某个任务使 cpu 达到 100%,遗憾的是节点将 block。我假设上传文件与提供静态资产的含义相同。 here 有很多关于 nodejs 不适合提供静态内容的讨论。请改用 nginx 或 apache。
另一种解决方案是将上传委托给工作进程或排队系统。例如,请参阅ZMQ。
【讨论】:
这不是真的。 CPU 百分比使用率取决于很多因素,上传几乎都是 IO。 100% CPU 不会总是阻塞。仅适用于逻辑密集型方法。它实际上可能只是代表一个非常完整的事件循环,这是有道理的,因为 multer 使用流。排队上传没有意义,您不能只是将请求排队到 ZMQ,然后将客户端重新连接到工作人员。人们将已上传的内容排队以进行处理,例如图像处理。 您好,欢迎您自己回答。看看它是否被接受? 我想我可以,但是只有在我对正在发生的事情有一个很好的了解时,我才会这样做。尽管显然一个简单的任务不应该使用 100% CPU。我的意思是,如果是的话,这并不直接表示阻塞。虽然它可能代表性能下降。以上是关于NodeJS 上传文件 100% cpu 使用率的主要内容,如果未能解决你的问题,请参考以下文章