Node.js 为什么Nodejs提供的文件比Nginx多80倍的CPU使用率?

Node.js 为什么Nodejs提供的文件比Nginx多80倍的CPU使用率?,node.js,nginx,Node.js,Nginx,以nodejs.org主页上的代码为例。提供1.8Mb的静态文件。对Nginx做同样的操作,并观察差异 code: Screencast: 如果您知道什么可以阻止这种情况发生,请与我们分享,这样我们就不需要部署nginx服务器并使我们的生活复杂化 ps1。此测试使用节点0.6.12完成。出于好奇,我降级到0.4.12只是为了检查这是否是一个回归,相反,情况更糟。同一文件使用了25%两次 ps2。这篇文章不是对nodejs的憎恨——我们使用nodejs,我们喜欢它,除了这个小故障,它实际上推迟了我

以nodejs.org主页上的代码为例。提供1.8Mb的静态文件。对Nginx做同样的操作,并观察差异

code:

Screencast:

如果您知道什么可以阻止这种情况发生,请与我们分享,这样我们就不需要部署nginx服务器并使我们的生活复杂化

ps1。此测试使用节点0.6.12完成。出于好奇,我降级到0.4.12只是为了检查这是否是一个回归,相反,情况更糟。同一文件使用了25%两次


ps2。这篇文章不是对nodejs的憎恨——我们使用nodejs,我们喜欢它,除了这个小故障,它实际上推迟了我们的发布(让我们非常难过),对我来说似乎相当严重。我从来没有读过、听过、看到过或期望看到过。

节点基准测试的问题是,您将静态文件存储在V8堆中的一个变量中。由于V8处理内存的方式,它不能直接将javascript变量中包含的数据发送到网络,因为分配对象的地址在运行时可能会发生变化,因此V8必须在每个请求中复制1.8MB字符串,这会降低性能

您可以使用:

替换:
longAssString=fs.readFileSync(pathToABigFile,'utf8')

使用:
longAssString=fs.readFileSync(pathToABigFile)


通过这种方式,您可以将静态文件保存在缓冲区中,缓冲区存储在V8s堆之外,发送到网络时不需要复制,因此速度应该更快。

我猜Nginx调用将字节直接从磁盘传输到线路,而不会留下任何内核空间,你的JavaScript做了比这多得多的工作。谢谢你的解释,哇,这确实让情况大为不同。下降到0.4-0.7!谢谢你,斯图。。