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.xv0.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 使用率的主要内容,如果未能解决你的问题,请参考以下文章

100% cpu 使用配置文件输出,根据我们的配置文件日志,这可能是啥原因造成的?

如何在ubuntu 安装nodejs

阿里云ECS的CPU100%排查

nodejs上传的文件如何使用

Nodejs应用程序过载CPU

阿里云ECS的CPU100%排查